一周的时光转瞬即逝,第二周的作业也悄悄地开始了。杨老师的一言一行都深深地刻在我的心里,“不迟到”是做人做事的根本,努力则是成就人生的基石。正如《道德经》中所言“天地不仁,视万物为刍狗”,上天对待世间万物是公平的,从来都是不偏不倚,只有勤奋好学的人才会得到垂青和奖赏。
㈠词频统计的四个功能
①首先控制台输入内容到文件中,再对文件进行词频统计;
②命令行输入英文作品名,然后统计作品词频;
③命令行输入英文作品文件的目录名,再批量统计;
④从控制台读入英文单篇作品,再统计词频。
功能①
功能一是先输入“type test.txt”命令,然后在控制台输入简短的英文句子,再输入“wf test.txt”命令展现控制台输入句子的词频。除了统计词频,该功能还统计了句子中不重复的单词数以及对单词频率进行了降序排序。本功能的重点怎么样从控制台读取字符串并保存到文本文件中,这里使用了BufferedWriter并且实现了在文本的追加功能。
控制台字符串保存到文本文件功能
1 //构造一个BufferedReader对象 2 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 3 bw = new BufferedWriter(new FileWriter("test.txt",true)); 4 //接收控制台一行的输入 5 String str = br.readLine(); 6 //如果换行后输入exit,则退出控制台输入操作。 7 while(!str.equals("exit")){ 8 //将控制台输入的字符串写入文件 9 bw.write(str); 10 //换行 11 bw.newLine(); 12 //刷新缓冲区 13 bw.flush(); 14 //继续接收控制台的输入 15 str = br.readLine(); 16 }
指令判断功能
1 /*指令判断功能(只有输入正确的指令才能统计词频,指令错误会给出提示)*/ 2 System.out.print(">"); 3 Scanner sc = new Scanner(System.in); 4 //读取指令 5 String scStr = sc.nextLine(); 6 String sp2 = "\s+"; 7 //对指令进行字符串分割 8 String str2[] = scStr.split(sp2); 9 //判断“wf”指令 10 if(!(str2[0].equals("wf"))) { 11 System.out.println("请确认您的命令!!!"); 12 System.exit(0); 13 } 14 //判断“-s”指令 15 if(!(str2[1].equals("-s"))) { 16 System.out.println("请确认您的命令!!!"); 17 System.exit(0); 18 } 19 //判断“test.txt”指令 20 if(!(str2[2].equals("test.txt"))) { 21 System.out.println("请确认您的命令!!!"); 22 System.exit(0); 23 }
运行截图
功能②
功能二是通过控制台输入“wf gone_with_the_wind”命令来统计这部英文作品的词频。同样,此功能也统计了不重复的单词数以及对单词频率进行了降序排序。功能2和功能1有相似之处,都要读取文件和统计词频。这里介绍一个四个功能都要用到的方法,也是十分重要的方法,这个方法就是字符串分割方法。字符串分割方法要利用好正则表达式的用法。此外,保存单词和词频也是非常重要的方法,这里使用Hashmap来保存单词和词频。
字符串分割功能
1 //将大写字符转换成小写字符(方便统计) 2 line.toLowerCase(); 3 //设置正则匹配字符 4 String mt ="\w+"; 5 //将每行读取的文本进行分割并存放在字符数组 6 String str[] = line.split("[^a-zA-Z]+");
保存单词和词频功能
1 for(String s: str) { 2 //判断s是否是字母开头 3 4 if(s.matches(mt)){ 5 if(!map.containsKey(s)){ 6 //如果集合中不存在该单词,则将该单词加入该集合中并且计数设为1。 7 map.put(s,1); 8 //每当有新单词加入,计数加1。 9 count++; 10 }else{ 11 //如果集合中存在该单词,则将该单词加入该集合中并且计数加1。 12 map.put(s,map.get(s)+1); 13 } 14 } 15 }
运行截图
功能③
功能三是通过命令行输入存储有英文作品文件的目录名的命令“dir folder”来展示目录下的所有英文作品,然后使用“wf folder”命令来分别统计所有英文作品的词频。这个功能介绍又一个重要的方法,那就是词频降序排序功能。降序排序其实是对Hashmap进行按值排序,然后输出前十个词频最高的单词。
词频降序排序功能
1 //将map.entrySet()转换成list 2 List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); 3 Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { 4 //降序排序 5 @Override 6 public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { 7 //return o1.getValue().compareTo(o2.getValue()); 8 return o2.getValue().compareTo(o1.getValue()); 9 } 10 });
运行截图
功能④
功能四是基于前三个功能来实现的。在这里解决一个每个程序都存在的问题,那就是如何对齐输出的单词和词频。使用制表符能很好地解决不对齐的问题。
解决单词和词频不能对齐问题
1 for (Map.Entry<String, Integer> mapping : list) { 2 System.out.println(mapping.getKey() + " " + mapping.getValue()); 3 }
运行截图
㈡PSP
任务 | 预计花费时间(分钟) | 实际花费时间(分钟) | 差距原因 |
功能一 | 80 | 103 | 开学的第一个程序,忘记了很多方法的使用。第一个功能是后面功能的基石。 |
功能二 | 40 | 65 | 用了很多时间查找比较好的排序算法,写字符串到文件的方法也不是很熟练。 |
功能三 | 40 | 58 | 由于要帮同学讲需求,花费了6分钟左右。 |
功能四 | 30 | 20 | 由于有了前三个功能的基础,所以第四个功能用时较少。 |
合计 | 190 | 246 |
㈢代码及版本控制
1、控制基本流程(四个功能上传了四个文件)
2、coding.net地址:https://git.coding.net/wangwd/SecondAssignment.git