作业4-两人编程<词频统计>
协作:苗中峰,刘鑫成
我主要攻克排序,成哥写了文件流的使用。整合工作由我完成,成哥帮我查阅资料,避免和解决语法错误。

这次任务较作业三的变化是:
*文件流读取,写入。
*单词排序(先按照频率排序,次数相同安字母顺序排序)
java文件流的读取上次作业已经get,所以这个按道理来说不算问题。 而文件流写入虽然上次没有用,但是它与读取是一个承启呼应的关系,不难掌握,但是还是出现了一个小插曲,稍后再提。
File file = new File("e:\\文档\\Gone_with_the_wind.txt");
FileReader reader = new FileReader(file);
int fileLen = (int)file.length();
char[] chars = new char[fileLen];
reader.read(chars);
String es= String.valueOf(chars);
读取txt内容转换为String型,用表示句子的变量es接受,接下来运用作业3中的方法进行分词,统计操作。
FileWriter writer = new FileWriter("E:\\Result.txt.txt");
for (int i = 0; i <infoids.size(); i++)
{
Entry<String, Integer> id =infoids.get(i);
writer.write(id.getKey()+' '+id.getValue()+"\r\n");
}
writer.flush();
writer.close();
将每组单词和对应的频率写入文件。现在来说说在文件写入时遇到的问题:第一次是直接把文件写入写进了循环体里面,导致每一次写入一组数据时会覆盖掉上一组数据,解决很简单:
FileWriter writer = new FileWriter("E:\\Result.txt.txt");
这条语句执行在循环体前
writer.flush();
writer.close();
这两条语句执行在循环体后。
下面是这次作业的一个重要步骤:sort
搜索一下排序方法,找到一个Collections类,可以对list对象实施排序操作:
1 public static void sort(List list)
2 public static void sort(List list,Comparator c)
第一行的方法是将元素按自然顺序排序,第二行的方法是按比较c排序。显然我们要先按频率排序要选择第二种方法。
Collections.sort(infoids, new Comparator<Map.Entry<String, Integer>>()
{ //先按频率降序排序,频率相同时按字母顺序排序
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2)
{
if(o1.getValue()<o2.getValue()) return 1;
else if(o1.getValue()>o2.getValue())
return -1;
else
return(o1.getKey().compareTo(o2.getKey()));
}
});
用compare方法比较两个Object类型的数据,通过调整返回值确定是按Value降序还是升序排序。最后当Value相同时,返回字母顺序的排序结果。(虽然我在这里只粗略的说了这么一点,但在我学习使用它时可是费了大力气!不过把它掌握了,费的力气就值得!)
实验结果:今天我把代码做了一点点修改,在读取文件前和写入文件后分别加上输出语句,来感受一下自己的程序到底执行时间怎么样,如图


修改:大文件效率测试
根据邹老师和鞠老师的提醒,下载一部长篇txt英语小说《简·爱》(1.8M大小)再次测试,这次我把排序封装到函数Sort(map);中,便于详细看到部分方法执行效率,体会一下效率差别。
首先看一下那部分运行时间最长:
结果也是我原来所想的那样,统计单词所用时间最长(isNumeric函数在统计单词中使用),其次是排序,文件流读取。

将 i<infoids.size(); 改为 int len=infoids.size(); i<len; 。下面是对比分析结果:可以看出,这条语句的修改还是明显提高了效率的。

实验结果如图:

通过这次作业我认识到编程语言在使用的时候的一个注意点:当我在某个块中定义一个变量时,该块外不好用,我也是在犯了几次错后认识到这个问题,这应该是变量的作用域的问题。
任务更新:
小林老师提醒把文件名作为参数,这样更灵活,为此,再次做简单修改:使用Scanner类,在控制台输入所想要处理的文件。新增代码如下:
//读取文档
System.out.println("请输入所要查询的文件路径及文件名:");
Scanner sc=new Scanner (System.in);
String files=sc.nextLine();
sc.close();
File file = new File(files+".txt");
问题是输入文件名还要带上文件路径,感觉不太方便。
这次更新的要求是查询指定单词的词频,在原来代码上实现这个功能比较简单,只需使用equalsIgnoreCase方法比较id.getKey()与所输入的单词是否匹配,如果匹配,输出键值(次数)即可,否则通过循环改变id,如此再进行匹配工作。新增代码如下:
System.out.println("请输入要查询的单词:");
Scanner sc=new Scanner(System.in);
String word=sc.nextLine();
sc.close();
int len =infoids.size();
for (int i = 0; i <len; i++)
{
Entry<String, Integer> id =infoids.get(i);
if(id.getKey().equalsIgnoreCase(word))
System.out.println("该词在本文件中出现的次数为:"+id.getValue()+"次");
else
continue;
}
测试结果如图:

另外,在写完代码时,发现了几个警告(虽然警告存在仍然可以运行),分别是提醒我有些引入的包没有使用,文件流没有关闭等。于是又进行了简单修改,终于把所有problem清除!

(完整源程序:https://github.com/miaozhongfeng/my-repository/blob/master/test4_2.java)
作业4-两人编程<词频统计>的更多相关文章
- 作业3-个人项目<词频统计>
上了一天的课,现在终于可以静下来更新我的博客了. 越来越发现,写博客是一种享受.来看看这次小林老师的“作战任务”. 词频统计 单词: 包含有4个或4个以上的字 ...
- task4: 结对编程-词频统计[修改版]
问题描述: 读取一个文件,统计其中单词出现次数,并按从高到低的顺序显示,相同顺序的字典序排列. 思路: 基于上次的程序用正则提取出文本里的单词,然后利用字典计数(先get,为null则置1,不为nul ...
- 词频统计小程序-WordCount.exe
一. 背景 最近顶哥为了完成学历提升学业中的小作业,做了一个词频统计的.exe小程序.因为当时做的时候网上的比较少,因此顶哥决定把自己拙略的作品发出来给需要的人提供一种思路,希望各位看官不要dis ...
- USTC《现代软件工程》春季学期——第一次个人作业:词频统计
截止日期 2018年3月29日23:59 要求 1. 对源文件(*.txt,*.cpp,*.h,*.cs,*.html,*.js,*.java,*.py,*.php等,文件夹内的所有文件)统计字符数. ...
- C# 词频统计 东北师范大学 软件项目管理 第一次作业
一.作为杨老师的学生第一次听杨老师讲课,印象最深的就是:工程中所有步骤之间是乘法,如果任何一步为0,工程就做不出来了.以前所有老师讲到的都是不要太在乎结果,努力的过程很重要,但是这在软件工程中不合适了 ...
- Hive简单编程实践-词频统计
一.使用MapReduce的方式进行词频统计 (1)在HDFS用户目录下创建input文件夹 hdfs dfs -mkdir input 注意:林子雨老师的博客(http://dblab.xmu.ed ...
- 【NLP】暑假课作业3 - 词性标注(简单词频概率统计)
作业任务: 使用98年人民日报语料库进行词性标注训练及测试. 作业输入: 98年人民日报语料库(1998-01-105-带音.txt),用80%的数据作为训练集,20%的数据作为验证集. 运行环境: ...
- 软工结对项目之词频统计update
队友 胡展瑞 031602215 作业页面 GitHub 具体分工 111500206 赵畅:负责WordCount的升级,添加新的命令行参数支持(自定义输入输出文件,权重词频统计,词组统计等所有新功 ...
- 软件工程第一次个人项目——词频统计by11061153柴泽华
一.预计工程设计时间 明确要求: 15min: 查阅资料: 1h: 学习C++基础知识与特性: 4-5h: 主函数编写及输入输出部分: 0.5h: 文件的遍历: 1h: 编写两种模式的词频统计函数: ...
随机推荐
- 如何生成可变表头的excel
1.实现功能: 传入一个表头和数据,将数据导入到excel中. 为了便于项目的扩展,数据传入通过泛型集合传入,获取数据时,通过反射的方式获取,这样无论你的表头是多少项,我都能很方便的生成.另外为了便于 ...
- Install pyodbc in OpenSUSE
Install pyodbc in OpenSUSE: Install unixODBC-2.3.2 ./configure --prefix=/usr/local/unixODBC --enable ...
- POJ1270 Following Orders[拓扑排序所有方案 Kahn]
Following Orders Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4885 Accepted: 1973 ...
- Visio连接数据表实体外键[快捷记录]
打开数据库模型图. 单击“常用”工具栏上的“连接线”工具. 将“连接线”工具放在父表的中心上,使表的四周出现轮廓线,然后拖到子表的中心.当子表出现轮廓线时,松开鼠标按钮. 两个连接点均变为红色,同时父 ...
- webstorm的中文教程和技巧分享
webstorm是一款前端javascript开发编辑的神器,此文介绍webstorm的中文教程和技巧分享.webstorm8.0.3中文汉化版下载:百度网盘下载:http://pan.baidu.c ...
- [No000001]一切都是最好的安排
<一切都是最好的安排> 从前有一个国家,地不大,人不多,但是人民过着悠闲快乐的生活,因为他们有一位不喜欢做事的国王和一位不喜欢做官的宰相. 国王没有什么不良嗜好,除了打猎以外,最喜欢与宰相 ...
- Html中模态框(弹出框)使用入门
作为html学习学习模态框需要二步: 效果图 第一步学习HTML中 div的弹出 ①触发按钮 <input class="btn btn-success" i ...
- 实现PD控制
尝试为场加入PD控制 在之前的模拟中,需要最小化一个能量函数H. 这样做的原因是,由理想约束的特性(约束反力垂直于虚位移),对于不含体积蒙皮的情况,可以推出 对于表面点,有 J^T * Σfs = 0 ...
- Docker 总结(转载)
原文链接:http://blog.tankywoo.com/docker/2014/05/08/docker-4-summary.html 查看docker的子命令,直接敲docker或完整的dock ...
- IntelliJ IDEA 打包可运行的 JAR
## 构建说明 创建Artifest任务 * File -> Project Structure -> Artifacts -> + JAR* 选择 From module with ...