作业要求
- [必做 1] 基于作业3的结果,读取一个较小的文本文件A_Tale_of_Two_Cities.txt,统计该文件中的单词的频率,并将统计结果输出到当前目录下的 Result1.txt 文件。 (第一阶段初稿完成该要求)
- 命令行格式: 提示符> Myapp.exe -f filename.txt > Result.txt (PS:C++ 程序,Java 程序输出方式类似) filename.txt 为前面下载的文件名。
- 解释:
- 选项 -f 表示后面跟文件名
- 输出格式规定(参考作业3中的示例):
- 首先按照频率由高到低排序
- 频率一样的词, 按照字典顺序排序
- 此外, 读取一个较大的文本文件Gone_with_the_wind.txt实验对比程序执行效率,做如下改进,比较改进前后程序执行时间。
本次和舍友 范鋆 同学一起合作完成 他的博客地址
合作图片
编程语言 JAVA
编译环境 eclipse
本次作业中我们遇到了比较大的困难,在第三次作业中我使用了c++编程。但是由于算法过于复杂在运行给出的大文件时程序崩溃。
应该是由于c++中数组的内存空间有限导致的。这段时间在学习java,所以在和舍友讨论后决定使用java语言完成此次作业。
我主要负责文件结果的输出部分主要代码如下
public static void sort(Map<String,Integer> map){ List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return (o2.getValue() - o1.getValue()); } }); //排序 String [] str3=null; int len=infoIds.size(); int count=1; try{ FileWriter fw=new FileWriter("Result1.txt"); BufferedWriter bw=new BufferedWriter(fw); int q=0; for (int i = 0; i < len; i++) { //输出 Map.Entry<String, Integer> id = infoIds.get(i); if(id.getKey()!=null) str3=id.getKey().split(""); if( str3!=null&&str3.length>3) //str3可能为空,且这个控制只有含有3个字母以上的单词才打印 if(count<=5) { q=id.getValue(); bw.write(id.getKey()); bw.write(": "); bw.write(String.valueOf(q)); bw.write(" "); count++; } else { q=id.getValue(); bw.write(id.getKey()); bw.write(": "); bw.write(String.valueOf(q)); bw.write(" "); //换行 count=1; } } bw.close();fw.close(); }catch(Exception e){ e.printStackTrace();} } }
程序结果
总结心得
通过本次合作编程,我意识到了合作的重要,两个人往往想法比一个人丰富。也很少会犯低级错误,写程序的效率大大提高了。