作业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: 编写两种模式的词频统计函数: ...
随机推荐
- Java实现点击一个Jlabel增加一个Jlabel的小功能
当界面生成以后,自己想做一个点击一个Jlabel增加一个Jlabel,即类似于QQ的添加好友以后可以及时的加进一个好友.自己做了好久,发现不能及时刷新.在网上查了一下,然后自己研究了一小会.发现需要v ...
- Stanford机器学习笔记-6. 学习模型的评估和选择
6. 学习模型的评估与选择 Content 6. 学习模型的评估与选择 6.1 如何调试学习算法 6.2 评估假设函数(Evaluating a hypothesis) 6.3 模型选择与训练/验证/ ...
- UESTC 395 Dynamic Query System --Treap
题意:让你维护一个集合,有8种操作: 1. I x 插入一个数 2. R x 删除x 3. S 输出总的数个数(集合大小) 4. L x 查询小于x的数的个数 5. W k 查询集合中 ...
- 三维网格去噪算法(two-step framework)
基于两步法的网格去噪算法顾名思义包含两个步骤:首先对网格表面的法向进行滤波,得到调整后的网格法向信息,然后根据调整后的法向更新顶点坐标位置,下面介绍三篇该类型的文章. [Sun et al. 2007 ...
- Maven学习(七)仓库
* Maven仓库 在项目开发中, 项目目录下往往会有一个lib目录,用来存放第三方依赖jar文件, 如spring log4j jar等文件, Maven仓库就是放置JAR文件(WAR,ZIP,P ...
- 向Tiny6410移植QT4.7.0版本
在移植QT之前我们首先要安装tslib,没有移植的可以看这篇文章移植. http://www.cnblogs.com/ynxf/p/5392476.html step 1: echo yes |../ ...
- Ant 命令行编译Android项目
首先把android sdk下的tools目录加到系统path环境变量里, 要么就得直接指定android.bat的绝对路径 对于一个新项目, 可以用这个命令创建需要的ant编译环境(可以看到andr ...
- Hibernate总结1(入门)
1,官网包简介 整体简介 Project包简介,这个包里有etc文件,这个etc主要包括了配置文件,最主要的是hibernate.cfg.xml文件 lib文件夹包含的是需要加载的依赖jar包,必须加 ...
- PHP代码20个实用技巧(转)
这些技巧特别是封装的,相对路径的还是挺好的,本身来自微信公众号,但是我担心以后删除,所以在我的博客上备份一下(微信公众号为:菜鸟教程) 在这篇文章中我们将看看一些关于PHP开发有用的提示和技巧,可以用 ...
- C#/JS 获取二维数组组合
C#获取二维数组组合 using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...