一.需求分析
通过分析实验二题目要求,得出的用户需求主要为:
- 程序可读入任意英文文本文件,该文件中英文词数大于等于1个;
- 程序需要很健壮,能读取容纳英文原版《哈利波特》10万词以上的文章;
- 程序可以实现用户指定单词词频统计功能;
- 用户从键盘输入高频词输出的个数k,运行程序统计功能,可按文本中词频数降序显示前k个单词的词频及单词;
- 统计该文本所有单词数量及词频数,并能将单词及词频数按字典顺序输出到文件result.txt。
二.功能设计
基本功能
- 功能一:程序在读入英文文本的基础上能实现统计用户指定单词出现的频率的功能;
- 功能二:在功能一的基础上用柱状图显示出单词出现频率的高低;
- 功能三:用户从键盘输入高频词输出的个数k,运行程序统计功能,可按文本中词频数降序显示前k个单词的词频及单词;
- 功能四:统计出文本中所有单词的数量并将单词输出到文件result.txt中
三.设计与实现
- 该程序中通过count.java来实现文本的单词统计功能,指定单词的统计及将单词输出到文件result.txt中;
- 在设计程序的读入任意英文文本的设计中使用bufferedreader,其作用是从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取;
BufferedReader br = new BufferedReader(new FileReader("test.txt"));
bufferedwriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入;
四.测试运行
程序运行结果如下图所示:
- 单词总个数为:
- 单词出现频数为:
- 指定查找单词个数为:
五.代码片段
Map<String, Integer> wordsCount = new TreeMap<String, Integer>(); // 存储单词计数信息,key值为单词,value为单词数
for (String li : lists) {
if (wordsCount.get(li) != null) {
wordsCount.put(li, wordsCount.get(li) + 1);
} else {
wordsCount.put(li, 1);
}
String f = find.next();
String word="";
int index=1;
int value=0;
for (Map.Entry<String, Integer> entry : list) {
if(entry.getKey().equals(f)){//
word=entry.getKey();
value=entry.getValue();
index=1;
break;
}else{
index=0;
}
}
if(index==1){
System.out.println("所查询的单词"+word+"出现的次数为:"+value);
}else{
System.out.println("对不起没有查询到该单词!");
}
六.总结
- 这次的实验看似是一个简单的个人项目,但是对于编程基础薄弱的我来说是一个巨大的挑战。在刚开始看到作业题目时,我认真分析了一下题目要求,大概明白程序所要实现的功能,但是对于具体的实现我毫无头绪,不知道该如何下手。所以我在前期搜集了许多关于词频统计的资料,尝试着去理解其中类各函数的作用 ,java的语法结构,类的定义等。由于我能力有限,所以没有完全按照老师要求实现上述每一项功能。 一个软件的设计前期要认真进行需求分析,部署好每一步,为软件的设计做好充分的准备,其次是要有一定的编程基础。通过这次的实验,我感触颇深,所以在以后的学习中,我要认真学习编程,一点一点的去弥补自己的不足,虽然学习一门语言不是一天两天就能够学会的,但我相信每天学习一点总会有进步的。
七.PSP
|
|
|
任务内容 |
计划完成时间(min) |
实际完成时间 |
计划 |
10 |
15 |
规划工作步骤 |
15 |
20 |
开发 |
200 |
240 |
需求分析 |
10 |
12 |
文档生成 |
10 |
15 |
设计复审 |
10 |
13 |
代码规范 |
10 |
10 |
具体编码 |
120 |
140 |
代码复审 |
10 |
13 |
测试 |
5 |
8 |
报告 |
15 |
20 |
测试报告 |
5 |
6 |
计算报告量 |
5 |
5 |
总结 |
10 |
8 |