20200917-2 词频统计

此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11206]

github链接:[https://github.com/userTeng/yang]

词频统计 SPEC
老五在寝室吹牛他熟读过《鲁滨逊漂流记》,在女生面前吹牛热爱《呼啸山庄》《简爱》和《飘》,在你面前说通读了《战争与和平》。但是,他的四级至今没过。你们几个私下商量,这几本大作的单词量怎么可能低于四级,大家听说你学习《构建之法》,一致推举你写个程序名字叫wf,统计英文作品的单词量并给出每个单词出现的次数,准备用于打脸老五。

希望实现以下效果。以下效果中数字纯属编造。

功能1 小文件输入。 为表明程序能跑,结果真实而不是迫害老五,请他亲自键盘在控制台下输入命令。
这一功能的需要我们去读取文件,然后对读取后的文件进行切割操作。
难点:对于读取到的数据数组,找出重复的单词,我使用HasMap来进行存储,单词第一出现放入Hash Map中,Key为单词,value为1,当出现重复单词时value加1。


重要文件读取代码如下:

public static String  fileRead(String name) throws Exception {
    File file = new File(name);
    FileReader reader = new FileReader(file);
    BufferedReader bReader = new BufferedReader(reader);
    StringBuilder sb = new StringBuilder();
    String s = "";
    while ((s =bReader.readLine()) != null) {
        sb.append(s);
    }
    bReader.close();
    String str = sb.toString();
    return str;
}

通过HashMap来对读取到的字符数组进行处理,代码如下:

public static void deal(String[] word,int len){
  int len2=0;
  HashMap<String,Integer> map=new HashMap<String,Integer>();
  for(int i=0;i<len;i++){
    int sight=0;
    len2=map.size();
    if(len2==0){
      map.put(word[i],1);
    }
    else{    
      for (Map.Entry<String, Integer> vo : map.entrySet()) {
        if(vo.getKey().equals(word[i])){
          map.put(vo.getKey(),vo.getValue()+1);
          sight=1;
          break;
         }
       }
    if(sight==0)
      map.put(word[i],1);
    }            
  }
  System.out.printf("total          %2d   words\n",map.size());
  List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
  list.sort(new Comparator<Map.Entry<String, Integer>>() {
    @Override
    public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
      return o2.getValue().compareTo(o1.getValue());
    }
   });
  map.put(null,null);
  int temp=0;
  for (Map.Entry<String, Integer> mapping : list){
    temp++;
    if(temp==10)
      break;
    System.out.printf("%-15s%2d\n",mapping.getKey(),mapping.getValue());
    }
}

 

 功能2 支持命令行输入英文作品的文件名,请老五亲自录入

 

重要代码片段:

public static void function1(String arg){
  int len=0;
  String txt
="";
  String name
=arg+".txt";
  
try{
    txt
=fileRead(name);//fileRead函数已在功能一中插入,在此不再重复
  }
catch(Exception e){
    e.printStackTrace();
  }
  System.
out.println(txt);
  txt
=txt.replaceAll("[\\pP\\p{Punct}]", " ");
  String[] word
=txt.split(" +");
  len
=word.length;
  deal(word,len); //deal函数已在功能一中插入,在此不再重复。
}

功能3 支持命令行输入存储有英文作品文件的目录名,批量统计。

重要代码片段:

public static void function3(String arg){
  String filepath="";
  filepath="E:\\GIT\\cangku\\yang\\"+arg+"\\";
  ArrayList<String> files = new ArrayList<String>();
  File file = new File(filepath);
  File[] tempLists = file.listFiles();
  for (int i = 0; i < tempLists.length; i ++) {
    if (tempLists[i].isFile()) {
      files.add(tempLists[i].toString());     }   }   
for (int i = 0; i < files.size(); i++) {     control(files.get(i));     System.out.println("--------------------------------------------------");   } }
public static void  control(String name){    
  int len=0;
  String txt="";
  System.out.println(name.substring(24));
  try{
    txt=fileRead(name);
  }catch(Exception e){
    e.printStackTrace();
  }
  txt=txt.replaceAll("[\\pP\\p{Punct}]", " ");
  String[] word=txt.split(" +");
  len=word.length;    
  deal(word,len);        
 }  

 功能4 从控制台读入英文单篇作品,这不是为了打脸老五,而是为了向你女朋友炫酷,表明你能提供更适合嵌入脚本中的作品(或者如她所说,不过是更灵活的接口)。如果读不懂需求,请教师兄师姐,或者 bing: linux 重定向,尽管这个功能在windows下也有,搜索关键词中加入linux有利于迅速找到。

功能四效果如下:

重要代码片段如下:

public static void function4(){
  int len=0;
  Scanner sc=new Scanner(System.in);
  String txt="";
  txt=sc.nextLine();
  String[] word=txt.split(" |\\.|,");
  len=word.length;        
  deal(word,len);    
}

PSP:







posted @ 2020-09-23 20:39  松鼠and龙猫  阅读(150)  评论(0编辑  收藏  举报