Github链接:https://github.com/369BRabc/W-Count
项目 | 内容 |
---|---|
软件工程 | 任课教师博客主页链接 |
结对项目要求 | 作业链接地址 |
课程学习目标 | 尝试按照《构建之法》第2章中2.3所述PSP流程,使用JAVA编程语言,独立完成一个英文文本词频统计的软件开发。 |
本次作业在哪个具体方面帮助我们实现目标 | (1)掌握软件项目个人开发流程。(2)掌握Github上发布软件项目的操作方法。 |
1、序言
在上一次的作业中,我们提到了使用Java语言去编写词频统计的系统开发,在每一步的开发过程中我们遇到了一系列问题,有一些耽误了我们开发的进度,另一些则导致我们对逻辑产生误解,下面我们会结合实验四的实验要求将问题一一提出并加以解决。
2、实验四 实验内容和步骤
任务1:尝试按照《构建之法》第2章中2.3所述PSP流程,使用JAVA编程语言,独立完成一个英文文本词频统计的软件开发。软件基本功能要求如下:
1.程序可读入任意英文文本文件,该文件中英文词数大于等于1个。
2.程序需要很壮健,能读取容纳英文原版《哈利波特》10万词以上的文章。
3.指定单词词频统计功能:用户可输入从该文本中想要查找词频的一个或任意多个英文单词,运行程序的统计功能可显示对应单词在文本中出现的次数和柱状图。
4.高频词统计功能:用户从键盘输入高频词输出的个数k,运行程序统计功能,可按文本中词频数降序显示前k个单词的词频及单词。
5.统计该文本所有单词数量及词频数,并能将单词及词频数按字典顺序输出到文件result.txt。
任务2:将包含任务1源码的完整工程文件提交到你注册Github账号下的项目仓库中。
3、代码展示
package com.xi.bei.shi.da.task.index.utils;
import com.xi.bei.shi.da.task.index.entity.ResponseEntity;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.*;
public class StatisticalWords {
public static List<ResponseEntity> statistical(InputStream inputStream) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
StringBuffer buffer = new StringBuffer();
String text;
while ((text = reader.readLine()) != null) {
buffer.append(text);// 将读取出的字符追加到stringBuffer中
}
reader.close(); // 关闭读入流
String str = buffer.toString().toLowerCase(); // 将stringBuffer转为字符并转换为小写
String[] words = str.split("[^(a-zA-Z)]+"); // 非单词的字符来分割,得到所有单词
Map<String, Integer> map = new HashMap<String, Integer>();
for (String word : words) {
if (map.get(word) == null) { // 若不存在说明是第一次,则加入到map,出现次数为1
map.put(word, 1);
} else {
map.put(word, map.get(word) + 1); // 若存在,次数累加1
}
}
// 排序
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
Comparator<Map.Entry<String, Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> left, Map.Entry<String, Integer> right) {
return (left.getValue().compareTo(right.getValue()));
}
};
// 集合默认升序升序
Collections.sort(list, comparator);
List<ResponseEntity> responseEntities = new ArrayList<>();
for (int i = 0; i < list.size(); i++)
{// 由高到低输出
if (i > 9) {
break;
}
ResponseEntity responseEntity = new ResponseEntity();
responseEntity.setKey(list.get(list.size() - i - 1).getKey());
responseEntity.setValue(list.get(list.size() - i - 1).getValue());
responseEntities.add(responseEntity);
System.out.println(list.get(list.size() - i - 1).getKey() + ":" + list.get(list.size() - i - 1).getValue());
}
return responseEntities;
}
}
4、实验输出
5、结对实验过程
6、结对评论
点评博客 | https://www.cnblogs.com/sjz961108/p/10552342.html |
Github链接地址 | https://github.com/sjz961108/-JavaScript |
点评内容 | 对于实验项目有自己独特的思考和独到的见解,并且对于规定的项目能够取长避短利用自己最熟练的技术来轻松的解决问题,这一点很赞。博文界面简介清晰,排版主次分明,内容饱满流畅。稍有不足的地方就是项目规定用JAVA,还是应该提高自己的JAVA能力,这样就更加优秀了。 |
点评心得 | 这次看到了结对伙伴利用自己的优势JS编写程序很是震惊,也私下向他讨教了编写中遇到的问题以及发现的闪光点。 |
7、PSP
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) |
Planning | 计划 | 15 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 15 |
Development | 开发 | 40 |
Analysis | 需求分析 (包括学习新技术) | 10 |
Design Spec | 生成设计文档 | 15 |
Design Review | 设计复审 (和同学一起审核设计文档) | 3 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 3 |
Design | 具体设计 | 20 |
Coding | 具体编码 | 30 |
Code Review | 代码复审 | 15 |
Test | 测试(自我测试,修改代码,提交修改) | 25 |
Reporting | 报告 | 25 |
Test Report | 测试报告 | 10 |
Size Measurement | 计算工作量 | 5 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 10 |
在实验二的过程中:
(1)计划阶段的不同意,在计划阶段我们原本打算花15分钟计划处出一个大致的流程,但因为意见的不统一和自身技术的缺陷而导致花了40分钟。
(2)开发阶段,是让我意识到自己的短板的时期,因为对代码的不熟悉,以及对于整体构造的不完美,导致花了大量的时间编写代码。
(3)需求分析是已知的,但需要整理转换为我们所需要的步骤要求。
8、在GitHub的实际操作过程中所遇到的问题和一些建议
(1)全英文界面对于英语基础低的同学去正确使用有着不小的困难,建议使用Chrome浏览器进行网页翻译。
(2)文件无法上传的问题:
https://www.cnblogs.com/wyl090512/p/9887795.html
9、实验四的完成总结
这次实验在实验二的基础上又增加了很多有难度的功能。如果自己独立完成很有挑战,很可能完成不了。老师也让我们结对完成实验,我们两人刚开始在编码设计的时候出现分歧,总是认为自己的观点是最好的,互不退让,后面经过一段时间的磨合之后,我们相互取长补短,才让实验更加顺利流畅的进行下去。这次我们都发现了自己的代码能力很弱,需要加强的地方还很多,继续加强代码能力是我们目前最大的目标。