此作业的要求参见:https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11206
词频统计 SPEC
本题有功能3和功能4未实现
已实现功能1,2,5运行截图如下:
我的思路是读取文件,失败的话显示读取失败,成功的话进而统计单词总数以及每个单词的频率。
功能1 小文件输入。 为表明程序能跑,结果真实而不是迫害老五,请他亲自键盘在控制台下输入命令。
本题难点(1)需要用FileBuffered和FileReader读取文件
(2)读取文件统计每个单词出现的次数,并且重复单词不能重复计数,并且特殊字符也不计数。
关键代码:
if (f.length() < 40000) { try { BufferedReader a = new BufferedReader(new FileReader(file1)); StringBuffer c = new StringBuffer(); //将文件内容存入StringBuffer中 while ((s = a.readLine()) != null) { //用于拼接字符串 c.append(s); }
功能2:支持命令行输入英文作品的文件名,请老五亲自录入。
本题难点:本题也是读入再统计,只不过文件内存稍微大一些。与功能1有相似之处。
关键代码:
//将StringBuffer转换成String,然后再将所有字符转化成小写字符 String m = c.toString().toLowerCase(); System.out.println(m + ' '); //匹配由数字和26个字母组成的字符串 String[] d = m.split("[^a-zA-Z0-9]+"); //遍历数组将其存入Map<String, Integer>中 Map<String, Integer> myTreeMap = new TreeMap<String, Integer>(); for (int i = 0; i < d.length; i++) { //containsKey()方法用于检查特定键是否在TreeMap中映射 if (myTreeMap.containsKey(d[i])) { count = myTreeMap.get(d[i]); myTreeMap.put(d[i], count + 1); } else { myTreeMap.put(d[i], 1); } } System.out.println("total" + d.length ); //通过比较器实现排序 List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(myTreeMap.entrySet()); //按降序排序 Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { public int compare(Entry<String, Integer> k1, Entry<String, Integer> k2) { //返回两个单词出现次数较多的那个单词的出现次数 return k2.getValue().compareTo(k1.getValue()); } });
功能3(未实现):支持命令行输入存储有英文作品文件的目录名,批量统计。
本题难点:这道题要批量读入文件,之前只会读一个文件,这次要批量读入,接下来就和功能1、2有相似之处了。虽然 查了资料但是我没有完成批量读入文件。
关键代码:无
功能4:从控制台读入英文单篇作品,这不是为了打脸老五,而是为了向你女朋友炫酷,表明你能提供更适合嵌入脚本中的作品(或者如她所说,不过是更灵活的接口)。如果读不懂需求,请教师兄师姐,或者 bing: linux 重定向,尽管这个功能在windows下也有,搜索关键词中加入linux有利于迅速找到。
本题未实现
功能5:
本题难点:本题将限定单词的长度,并把频率最高的top几单词输出,就需要在统计每个单词个数的时候也把长度统计,然后按排序输出。
关键代码:
System.out.println("请输入单词长度j位:"); n2 = sc.nextInt(); System.out.println("请输入词频前i位:"); n = sc.nextInt(); for (Entry<String, Integer> map : list) { if (map.getKey().length() <= n2){ if (num <= n) { //输出到程序控制台 System.out.println(map.getKey() +' ' + map.getValue()); num++; } } }
2.PSP
本次作业没有将功能全部实现的原因:
(1)自己本身编程能力薄弱,经过此次作业更加验证会一门编程语言的重要性。
(2)没有在第一时间开始本次作业,导致后面有些着急,对于未实现的功能如果有更多时间或许可以再研究出来。
(3)虽然已经预测到自己惨淡的分数,但尽量将功能5实现,希望能够弥补。
3.此程序上交在guithub,地址
https://github.com/zhaoxinping-arch/work