这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zswxy/computer-science-class4-2018 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/computer-science-class4-2018/homework/11880 |
这个作业的目标 | 编程作业 |
其他参考文献 | 《构建之法》 |
1. gitee链接
2. PSP表格(预计)
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) |
---|---|---|
Planning | 计划 | 10 |
Estimate | 估计这个任务需要多少时间 | 30 |
Development | 开发 | 300 |
Analysis | 需求分析 (包括学习新技术) | 30 |
Design Spec | 生成设计文档 | 40 |
Design Review | 设计复审 | 30 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 |
Design | 具体设计 | 200 |
Coding | 具体编码 | 300 |
Code Review | 代码复审 | 20 |
Test | 测试(自我测试,修改代码,提交修改) | 30 |
Reporting | 报告 | 60 |
Test Repor | 测试报告 | 20 |
Size Measurement | 计算工作量 | 20 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 |
合计 | 1130 |
3. 解题思路
3.1. 需求分析
- 统计文件的字符数(对应输出第一行)
- 统计文件的单词总数(对应输出第二行)
- 统计文件的有效行数(对应输出第三行)
- 统计文件中各单词的出现次数(对应输出接下来10行)
- 输出结果
3.2. 概要设计
- 文件的读写
- 使用输入输出流对文件进行读写操作
- 计算行数、计算字符
- 使用
BufferedReader
类中readline()
方法进行行数的读取,同时计算行数 - 使用
InputStream
中的方法available()
得到文件的字符数
- 使用
- 单词的处理与计数
- 将整个文件读取出来后,进行规格化处理,将换行符和其他字符均设置为一个空格
- 将整理后的字符串通过空格分割为一个字符串数组
- 对数组中每一个字符串进行判断,是否符合题目规则
- 将每一个符合规则的单词进行统计计数,从而得到单词的总数
- 单词频率统计
- 使用
Map集合
以键值对的形式保存单词和其出现的频率
- 使用
4. 代码规范
5. 计算模块接口的设计与实现过程
FileWordSplit()
该方法读取文件,对文件的字符进行处理,分割出若干个单词
// 将文件中的字符切割为字符数组
public static String[] FileWordSplit(String input) throws IOException {
InputStream in = new FileInputStream(input);
StringBuilder buffer = new StringBuilder();
// 获取字符个数
int size = in.available();
for (int i = 0; i < size; i++) {
// 读取文件中每一个字符
char b = (char) in.read();
if (b == '
' || b == '
' || b >= '!' && b <= '/' || b >= ':' && b <= '@' || b >= '[' && b <= '`'
|| b >= '{') {
b = ' ';
}
buffer.append(b);
}
String[] word = buffer.toString().toLowerCase().split("\s+");
return word;
}
WordFrequency()
统计单词出现的频率,使用hashMap保存
// 统计单词出现频率
public static ArrayList<Entry<String, Integer>> WordFrequency(String input) throws IOException {
Map<String, Integer> wordMap = new HashMap<String, Integer>();
String[] word = FileWordSplit(input);
for (String string : word) {
if (CheckWord(string)) {
if (wordMap.containsKey(string)) {
Integer num = wordMap.get(string) + 1;
wordMap.put(string, num);
} else {
wordMap.put(string, 1);
}
}
}
ArrayList<Entry<String, Integer>> list = SortMap(wordMap);
return list;
}
SortMap()
对使用键值对保存的单词和其出现频率的集合进行排序
CountWord()
统计单词的总个数
CountLine()
使用InputStream
的readLine()
统计总行数
CountChar()
使用BufferedReader
的available()
统计总字符数
OutputFileContent()
使用OutputStream
将数据写入文件中
6、计算模块接口部分的性能改进
暂时想不到改进的地方和方法
7、单元测试和性能分析
- 将文件中的字符切割为字符数组
FileWordSplit()
测试
单词除去空格和特殊符号存入数组中
- 整体测试
8、异常处理说明
当文件找不到时会跳出异常
9、PSP表格(实际)
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 10 |
Estimate | 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | 300 | 400 |
Analysis | 需求分析 (包括学习新技术) | 30 | 30 |
Design Spec | 生成设计文档 | 40 | 60 |
Design Review | 设计复审 | 30 | 30 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 20 |
Design | 具体设计 | 200 | 200 |
Coding | 具体编码 | 300 | 400 |
Code Review | 代码复审 | 20 | 20 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 30 |
Reporting | 报告 | 60 | 60 |
Test Repor | 测试报告 | 20 | 30 |
Size Measurement | 计算工作量 | 20 | 20 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 1130 | 1370 |
10、心路历程与收获
在实现项目的过程中发现了自身诸多的不足,许多东西曾经学过,而如今已然忘却,在光研究git便耗费了我3个小时的光景,至于编程语言也略有生疏。虽然本次作业的编程题目总体来说难度不大,但是对完成这一个整体的作业而言,相比较之下由于自身对于gitee和GitHub使用的并不多所花费的时间和精力更大,而且我对于测试也并不太熟悉,只是曾经略有了解过,还是存在较多的弱项,自身的学习任然需要进一步的加深。