zoukankan      html  css  js  c++  java
  • 单词统计续

           这次练习是在一次的测试的基础上进行的,主要目的是要求我们进行功能模块的划分,这就要求我们写代码时思路要清晰,最大程度地实现代码的重构复用;这一点自己也是深有体会。

           本来第一问做的是很快的,大部分时间都用在了第二问----过滤无用词上,用了大概1个小时40分钟。至于为什么用了这么长时间,课下我也是认真反思,发现主要原因是在‘==’和‘equals’还有‘break’和‘continue’的区别上,这一点上学期老师让我们发博客总结过,但是当时没有认真对待,导致现在对这两点都有点迷糊。下来一定会好好总结下这些容易混淆的知识点。

           经过课下的研究,目前完成前两个功能,代码冗余比较严重,下来还会对代码进行改进,目前代码如下:

         

    package xxx;
    /* yr
     * 2019/4/28
     */
    
    import java.io.*;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Scanner;
    
    import jdk.internal.org.objectweb.asm.util.CheckAnnotationAdapter;
    
    public class Word{
        
        //统计26个英文字母(不区分大小写)出现的频率
        public void check1(String string) {
             try {
                    char num[] = new char[10000];          //存储读取的各个字符
                    char c[] = new char[26];                 //存储26个英文字母
                    c[0]='a';
                    for(int i=1;i<26;i++)
                    {
                        c[i]=(char)(c[i-1]+1);
                    }
                    
                    int j=0;
                    double count[]=new double[26];                 //存储26个英文字母出现的次数
                    double p[]=new double[26];               //存储26个英文字母出现的频率
                    String pathname=string;
                    File filename=new File(pathname);
                    InputStreamReader reader=new InputStreamReader(new FileInputStream(filename));
                    BufferedReader br=new BufferedReader(reader);
                    String line[]=new String[100];;    
                    for(int i=0;i<line.length;i++){
                    line[i]=br.readLine();     //读取一行             
                    }
             
                    br.close();
                    int n=0;
                  
                     while(line[n]!=null) {
                        
                         for(int i=0;i<line[n].length();i++) {                                
                              num[j]=line[n].charAt(i);
                              j++;                     
                         }
                  n++;
                    }    
                    
                    for(int i=0;i<num.length;i++) {
                         switch(num[i]) {
                         
                         case 'a':count[0]++;break;
                         case 'b':count[1]++;break;
                         case 'c':count[2]++;break;
                         case 'd':count[3]++;break;
                         case 'e':count[4]++;break;
                         case 'f':count[5]++;break;
                         case 'g':count[6]++;break;
                         case 'h':count[7]++;break;
                         case 'i':count[8]++;break;
                         case 'j':count[9]++;break;
                         case 'k':count[10]++;break;
                         case 'l':count[11]++;break;
                         case 'm':count[12]++;break;
                         case 'n':count[13]++;break;
                         case 'o':count[14]++;break;
                         case 'p':count[15]++;break;
                         case 'q':count[16]++;break;
                         case 'r':count[17]++;break;
                         case 's':count[18]++;break;
                         case 't':count[19]++;break;
                         case 'u':count[20]++;break;
                         case 'v':count[21]++;break;
                         case 'w':count[22]++;break;
                         case 'x':count[23]++;break;
                         case 'y':count[24]++;break;
                         case 'z':count[25]++;break;
                         case 'A':count[0]++;break;
                         case 'B':count[1]++;break;
                         case 'C':count[2]++;break;
                         case 'D':count[3]++;break;
                         case 'E':count[4]++;break;
                         case 'F':count[5]++;break;
                         case 'G':count[7]++;break;
                         case 'H':count[6]++;break;
                         case 'I':count[8]++;break;
                         case 'J':count[9]++;break;
                         case 'K':count[10]++;break;
                         case 'L':count[11]++;break;
                         case 'M':count[12]++;break;
                         case 'N':count[13]++;break;
                         case 'O':count[14]++;break;
                         case 'P':count[15]++;break;
                         case 'Q':count[16]++;break;
                         case 'R':count[17]++;break;
                         case 'S':count[18]++;break;
                         case 'T':count[19]++;break;
                         case 'U':count[20]++;break;
                         case 'V':count[21]++;break;
                         case 'W':count[22]++;break;
                         case 'X':count[23]++;break;
                         case 'Y':count[24]++;break;
                         case 'Z':count[25]++;break;
                         }
                    }    
                    
         
                    double sum=0.0;
                    System.out.println("短文中各字母出现情况统计如下:");
                    for(int i=0;i<26;i++)
                    {
                        sum=sum+count[i];
                    } 
                    
                    
                    for(int i=0;i<26;i++)
                    {
                        
                        p[i]=(Math.round(count[i]/sum * 10000) / 100.0);
                       
                    }
                  
                    //对频率数组进行排序
                    double temp;                
                    char f;
                    for(int i=0;i<25;i++) //冒泡排序,外循环有N-1轮
                        for(int t=0;t<25-i;t++)
                        if(p[t]<p[t+1])            //从大到小
                        {
                            temp=p[t];
                            p[t]=p[t+1];
                            p[t+1]=temp;                              
                            
                            f=c[t];
                            c[t]=c[t+1];
                            c[t+1]=f;
                        }
                    
                    //输出
                    for(int i=0;i<26;i++)
                    {
                        System.out.println(c[i]+"的频率为:"+p[i]+"%");
                    }
                   
                }catch (Exception e) {
                    e.printStackTrace();
                }
        }
        //统计最常出现的N个单词出现的
            public void check2(String string) {
                  BufferedReader br = null;
                try {
                    br = new BufferedReader(new FileReader(string));
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    
                    StringBuffer sb = new StringBuffer();
                    String text =null;
                    try {
                        while ((text=br.readLine())!= null){
                            sb.append(text);// 将读取出的字符追加到stringbuffer中
                        }
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    try {
                        br.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }  // 关闭读入流
                    String str = sb.toString().toLowerCase(); // 将stringBuffer转为字符并转换为小写
                    String[] words = str.split("[^(a-zA-Z)]+");  // 非单词的字符来分割,得到所有单词
                    Map<String ,Integer> map = new HashMap<String, Integer>() ;
    
                    for(String word :words){
                        if(map.get(word)==null){  // 若不存在说明是第一次,则加入到map,出现次数为1
                            map.put(word,1);
                        }else{
                            map.put(word,map.get(word)+1);  // 若存在,次数累加1
                        }
                    }
    
                    // 排序
                   List<Map.Entry<String ,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
    
                    Comparator<Map.Entry<String,Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() {
                        public int compare(Map.Entry<String, Integer> left, Map.Entry<String, Integer> right) {
                            int i=left.getValue()-right.getValue();
                            if(i==0) {
                                return (right.getKey().compareTo(left.getKey()));
                            }
                            return (left.getValue().compareTo(right.getValue()));
                        }
                    };
                  
                    // 集合默认升序
                    Collections.sort(list,comparator);
                    int n=list.size();
                    
                
                    
    
                    for(int i=0;i<list.size();i++){// 由高到低输出
                        System.out.println(list.get(list.size()-i-1).getKey() +":"+list.get(list.size()-i-1).getValue());
                    }
            }
        
        //统计最常出现的N个单词出现的
        public void check3(String string) {
              BufferedReader br = null;
            try {
                br = new BufferedReader(new FileReader(string));
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
                StringBuffer sb = new StringBuffer();
                String text =null;
                try {
                    while ((text=br.readLine())!= null){
                        sb.append(text);// 将读取出的字符追加到stringbuffer中
                    }
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                try {
                    br.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }  // 关闭读入流
                String str = sb.toString().toLowerCase(); // 将stringBuffer转为字符并转换为小写
                String[] words = str.split("[^(a-zA-Z)]+");  // 非单词的字符来分割,得到所有单词
                Map<String ,Integer> map = new HashMap<String, Integer>() ;
    
                for(String word :words){
                    if(map.get(word)==null){  // 若不存在说明是第一次,则加入到map,出现次数为1
                        map.put(word,1);
                    }else{
                        map.put(word,map.get(word)+1);  // 若存在,次数累加1
                    }
                }
    
                // 排序
               List<Map.Entry<String ,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
    
                Comparator<Map.Entry<String,Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() {
                    public int compare(Map.Entry<String, Integer> left, Map.Entry<String, Integer> right) {
                        int i=left.getValue()-right.getValue();
                        if(i==0) {
                            return (right.getKey().compareTo(left.getKey()));
                        }
                        return (left.getValue().compareTo(right.getValue()));
                    }
                };
              
                // 集合默认升序
                Collections.sort(list,comparator);
                int n=list.size();
                System.out.println("请输入你要统计前多少个单词(<"+n+")");
                Scanner scanner=new Scanner(System.in);
                n=scanner.nextInt();
    
                for(int i=0;i<n;i++){// 由高到低输出
                    System.out.println(list.get(list.size()-i-1).getKey() +":"+list.get(list.size()-i-1).getValue());
                }
        }
        
        //递归遍历目录下所有文件
        public void test(String fileDir) {
    
            List<File> fileList = new ArrayList<File>();
    
            File file = new File(fileDir);
    
            File[] files = file.listFiles();// 获取目录下的所有文件或文件夹
    
            if (files == null) {// 如果目录为空,直接退出
    
                return;
    
            }
    
            // 遍历,目录下的所有文件
    
            for (File f : files) {
    
                if (f.isFile()) {
                    
                    fileList.add(f);
    
                } else if (f.isDirectory()) {
    
                    System.out.println(f.getAbsolutePath());
    
                    test(f.getAbsolutePath());
    
                }
    
            }
            Word word=new Word();
            String str="";
            for (File f1 : fileList) {
                str=fileDir+"\\"+f1.getName();
                System.out.println(str);
                //对文件进行统计
                word.check1(str);
                word.check2(str);
            }
            
        }
        
        //过滤无用词
        public String []nouse()
        {
            BufferedReader br = null;
            try {
                br = new BufferedReader(new FileReader("D:\大二下\软件工程\stop.txt"));
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
                StringBuffer sb = new StringBuffer();
                String text =null;
                try {
                    while ((text=br.readLine())!= null){
                        sb.append(text);// 将读取出的字符追加到stringbuffer中
                    }
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                try {
                    br.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }  // 关闭读入流
                String str = sb.toString().toLowerCase(); // 将stringBuffer转为字符并转换为小写
                String[] words = str.split("[^(a-zA-Z)]+");  // 非单词的字符来分割,得到所有单词
    //            for(int i=0;i<words.length;i++) {
    //                System.out.print("words["+i+"]:"+words[i]+" ");
    //            }
                return words;                   
        }
        //过滤无用词表
        public void check4(String string) {
            BufferedReader br = null;
            try {
                br = new BufferedReader(new FileReader(string));
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
                StringBuffer sb = new StringBuffer();
                String text =null;
                try {
                    while ((text=br.readLine())!= null){
                        sb.append(text);// 将读取出的字符追加到stringbuffer中
                    }
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                try {
                    br.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }  // 关闭读入流
                String str = sb.toString().toLowerCase(); // 将stringBuffer转为字符并转换为小写
                String[] words = str.split("[^(a-zA-Z)]+");  // 非单词的字符来分割,得到所有单词
                
                Map<String ,Integer> map = new HashMap<String, Integer>() ;
                Word word=new Word();
                String []c=word.nouse();    
                for(String word1 :words){
    //                System.out.println(word1);
                    int j=0;
                    for(j=0;j<c.length;j++) {                    
                            if(word1.equals(c[j])) {
                                break;
                            }                                        
                     }                
                    if(j==c.length)
                    {
                        if(map.get(word1)==null){  // 若不存在说明是第一次,则加入到map,出现次数为1
                            map.put(word1,1);
                        }else{
                            map.put(word1,map.get(word1)+1);  // 若存在,次数累加1
                        }
                    }
                    
                }
                // 排序
                   List<Map.Entry<String ,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
    
                    Comparator<Map.Entry<String,Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() {
                        public int compare(Map.Entry<String, Integer> left, Map.Entry<String, Integer> right) {
                            int i=left.getValue()-right.getValue();
                            if(i==0) {
                                return (right.getKey().compareTo(left.getKey()));
                            }
                            return (left.getValue().compareTo(right.getValue()));
                        }
                    };
                  
                    // 集合默认升序
                    Collections.sort(list,comparator);
                    int n=list.size();
                    System.out.println("请输入你要统计前多少个单词(<"+n+")");
                    Scanner scanner=new Scanner(System.in);
                    n=scanner.nextInt();
    
                    for(int i=0;i<n;i++){// 由高到低输出
                        System.out.println(list.get(list.size()-i-1).getKey() +":"+list.get(list.size()-i-1).getValue());
                    }
        }
        
         public static void main(String args[]) {
               Word word=new Word();
               Scanner scanner=new Scanner(System.in);
               System.out.println("请输入要查询的文件目录如(D:\\大二下\\软件工程\\word.txt)");
               String str=scanner.next();
    //           System.out.println(str);
    //           word.test(str);
               
              int a=0;
               do {
               System.out.println("请选择 :0:字母出现的频率  1:统计最常出现的单词  2:统计前N个最常出现的单词  3:过滤无用词  其他:结束");
               a=scanner.nextInt();
               if(a==0)
               {
                   word.check1(str);
               }
               else if(a==1)
               {
                   word.check2(str);
               }
               else if(a==2)
               {
                   word.check3(str);
               }
               else if(a==3)
               {
                   word.check4(str);
               }
          }while(a!=0||a!=1||a!=2||a!=3);
                         
        }
    
    }
  • 相关阅读:
    【装机知识】内存条知识总结
    【装机知识】主板知识整理
    【装机知识】CPU知识整理
    SHELL 学历笔记
    tmux 会话恢复(no sessions)
    数据库客户端神器(mycli/pgcli/iredis)
    golang编写二叉树
    编译安装带lua 的 vim 编辑器
    linux 下vim 开发环境配置(通用所有编程语言)
    mac 下安装mysql
  • 原文地址:https://www.cnblogs.com/qianmo123/p/10840691.html
Copyright © 2011-2022 走看看