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);
                         
        }
    
    }
  • 相关阅读:
    sqlplus时报Linux-x86_64 Error: 13: Permission denied
    thrift之TTransport层的缓存传输类TBufferedTransport和缓冲基类TBufferBase
    Java实现 蓝桥杯 算法提高 新建Microsoft world文档
    Java实现 蓝桥杯 算法提高 新建Microsoft world文档
    Java实现 蓝桥杯 算法提高 快乐司机
    Java实现 蓝桥杯 算法提高 快乐司机
    Java实现 蓝桥杯 算法提高 队列操作
    Java实现 蓝桥杯 算法提高 队列操作
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 合并石子
  • 原文地址:https://www.cnblogs.com/qianmo123/p/10840691.html
Copyright © 2011-2022 走看看