• 个人作业8 单词统计


    用户需求:

    英语的26 个字母的频率在一本小说中是如何分布的?

    某类型文章中常出现的单词是什么?

    某作家最常用的词汇是什么?

    《哈利波特》 中最常用的短语是什么,等等。

    我们就写一些程序来解决这个问题,满足一下我们的好奇心。

    第0步:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。

    字母频率 = 这个字母出现的次数 / (所有A-Z,a-z字母出现的总数)

    如果两个字母出现的频率一样,那么就按照字典序排列。  如果 S 和 T 出现频率都是 10.21%, 那么, S 要排在T 的前面。

    第1步:输出单个文件中的前 N 个最常出现的英语单词。

    作用:一个用于统计文本文件中的英语单词出现频率。

    单词:以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。

    英文字母:A-Z,a-z

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.text.DecimalFormat;
    import java.util.Map;
    import java.util.Scanner;
    import java.util.TreeMap;
    class expression{
        char ex;
        double a;
        String b;
        expression()
        {
            ex=0;
            a=0;
            b=null;
        }
    }
    class word{
        String name;
        int num;
        word()
        {
            name=null;
            num=-1;
        }
    }
    public class Main {
        public static void findword(String text) throws IOException{
            @SuppressWarnings("resource")
            Scanner scan=new Scanner(System.in);
            int i=0;
            String[] array = {".",",","?","!"};
            for (int i1 = 0; i1 < array.length; i1++) {
                text = text.replace(array[i1]," ");
            }
            String[] textArray = text.split(" ");
            Map<String, Integer> map = new TreeMap<String, Integer>();
            for (int i1 = 0; i1 < textArray.length; i1++) {
                String key = textArray[i1];
                //转为小写
                String key_l = key.toLowerCase();
                if(!"".equals(key_l)){
                    Integer num = map.get(key_l);
                    if(num == null || num == 0){
                        map.put(key_l, 1);
                    }
                    else if(num > 0){
                        map.put(key_l, num+1);
                    }
                }
            }
            for(@SuppressWarnings("unused") String e:map.keySet()){
                // System.out.println("单词:"+e+" 次数:"+map.get(e));
                i++;
            }
            dc [] z=new dc[i];
            for(int m=0;m<=i-1;m++) {
                z[m]=new dc();
            }
            int j=0;
            for(String e:map.keySet()) {
    //            if(z[j]!=null) {
    //                z[j].name=e;
    //                z[j].num=map.get(e);
    //            }
                if(z[j]!=null&&!nousejudge(e,"nouse.txt")) {
                    z[j].name=e;
                    z[j].num=map.get(e);
                }
                j++;
            }
            dc t=new dc();
            for(int m=0;m<=i-1;m++)
            {
                for(int n=m;n<=i-1;n++) {
                    if(z[m]!=null&&(z[m].num<z[n].num)) {
                        t=z[m];
                        z[m]=z[n];
                        z[n]=t;
                    }
                }
            }
            for(int p=0;p<=i-1;p++) {
                System.out.println("单词:"+z[p].name+" 次数:"+z[p].num);
            }
            System.out.println("请输入想要输出前几位次数较多的单词:");
            int b=scan.nextInt();
            for(int m=0;m<=b-1;m++) {
                if(z[m]!=null) {
                    System.out.println("单词:"+z[m].name+" 次数:"+z[m].num);
                }
            }
        }
        public static void judgezimu(String str1)
        {
            char zm[]=new char[26];
            int ci[]=new int[26];
            DecimalFormat df = new DecimalFormat("0.00");
            double sum=0;
            int i;
            int flag=0;
            String str=str1.toLowerCase();
            int count;
            char chs[]=str.toCharArray();
            for(char ch='a';ch<='z';ch++)
            {
                
                count=0;//计数器
                for(i=0;i<chs.length;i++)
                {
                    if(ch==chs[i])
                        count++;
                }
                if(count!=0) {
                    zm[flag]=ch;
                    ci[flag]=count;
                    sum=sum+count;
                    flag++;
                }
            }
            zimu z[]=new zimu[flag];
            for(int m=0;m<flag;m++) {
                z[m]=new zimu();
            }
            for(i=0;i<flag;i++)
            {
                z[i].zm=zm[i];
                z[i].ci=ci[i];
                z[i].pl=df.format(ci[i]/sum);
            }
            zimu t=new zimu();
            for(i=0;i<flag;i++)
            {
                for(int j=0;j<flag;j++)
                {
                    if(z[i].ci>z[j].ci)
                    {
                        t=z[i];
                        z[i]=z[j];
                        z[j]=t;
                    }
                }
            }
            for(i=0;i<flag;i++)
            {
                System.out.println(z[i].zm+":次数:"+z[i].ci+"频率:"+z[i].pl);
            }
        }
        public static String readtxt(String txt) throws IOException
        {
            File file = new File(txt);//定义一个file对象,用来初始化FileReader
            FileReader reader = null;
            try {
                reader = new FileReader(file);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            BufferedReader bReader = new BufferedReader(reader);//new一个BufferedReader对象,将文件内容读取到缓存
            StringBuilder sb = new StringBuilder();//定义一个字符串缓存,将字符串存放缓存中
            String s = "";
            while ((s =bReader.readLine()) != null) {
            sb.append(s);//将读取的字符串添加换行符后累加p存放在缓存中
            }
            bReader.close();
            String str = sb.toString();
            return str;
        }
        public static boolean nousejudge(String danci,String txt) throws IOException {
            String str=readtxt(txt);
            String[] nouse = str.split(" ");
            for(int i=0;i<nouse.length;i++)
            {
                if(danci.equals(nouse[i]))
                {
                    return true;
                }
            }
            return false;
        }
        public static void main(String[] args) throws IOException {
            // TODO Auto-generated method stub
            //String str = readtxt("zimu.txt");
            //judgezimu(str);
            String str1 = readtxt("danci.txt");
            findword(str1);
        }
    }
  • 相关阅读:
    Codeforces Round #263 (Div. 2)
    蓝桥杯 翻硬币
    蓝桥杯 错误的票据
    蓝桥杯 带分数
    蓝桥杯 核桃的数量 求三个数的最小公倍数
    poj 3928 ping pong 树状数组
    lca
    poj 3927 Priest John's Busiest Day
    种类并查集
    高桥和低桥 ( 代代相传刷qq + 无敌二分 )
  • 原文地址:https://www.cnblogs.com/jbwen/p/11071753.html
Copyright © 2020-2023  润新知