标题
这个作业属于哪个课程 | 软件工程 |
---|---|
这个作业要求在哪里 | 202103226-1 编程作业 |
这个作业的目标 | 学习使用码云,以及相关题目的编写 |
作业正文 | 正文 |
其他参考文献 | 参考了福州大学一些同学的思路 |
part1:WordCount编程
1.码云项目地址
2.PSP表格
PSP | Personal Software Process tages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 1600 | 2520 |
Estimate | 估计这个任务需要多少时间 | 1920 | 2520 |
Development | 开发 | 300 | 600 |
Analysis | 需求分析(包括学习新技术) | 200 | 240 |
Design Spec | 生成设计文档 | 30 | 40 |
Design Review | 设计复审 | 30 | 30 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
Design | 具体设计 | 200 | 220 |
Coding | 具体编码 | 800 | 900 |
Code Review | 代码复审 | 30 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 100 | 140 |
Reporting | 报告 | 60 | 80 |
Test Repor | 测试报告 | 60 | 70 |
Size Measurement | 计算工作量 | 20 | 30 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 80 |
合计 | 1920 | 2520 |
3.解题思路描述
(1) 统计文件的字符数(对应输出第一行):
- 只需要统计Ascii码,汉字不需考虑
- 空格,水平制表符,换行符,均算字符
//将字符串转为char数组通过ascii码去除中文
char[] chars = line.toCharArray();
for (char c : chars) {
//去除中文ascii码范围
if (!(19968 <= c && c < 40869)) {
++num; //统计字符总数
}
}
(2) 统计文件的单词总数(对应输出第二行),单词:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写。
- 英文字母: A-Z,a-z
- 字母数字符号:A-Z, a-z,0-9
- 分割符:空格,非字母数字符号
- 例:file123是一个单词, 123file不是一个单词。file,File和FILE是同一个单词
(3) 统计文件的有效行数(对应输出第三行):任何包含非空白字符的行,都需要统计。
(4) 统计文件中各单词的出现次数(对应输出接下来10行),最终只输出频率最高的10个。
-
频率相同的单词,优先输出字典序靠前的单词。
例如,windows95,windows98和windows2000同时出现时,则先输出windows2000
-
输出的单词统一为小写格式
然后将统计结果输出到output.txt,输出的格式如下;其中word1和word2 对应具体的单词,number为统计出的个数;换行使用' ',编码统一使用UTF-8。
characters: number
words: number
lines: number
word1: number
word2: number
...
相关代码
//先获取所有出现次数
Collection<Integer> values = map.values();
ArrayList<Integer> list = new ArrayList<>(values);
//给出现次数从大到小排序
list.sort((o1, o2) -> o2 - o1);
System.out.println(list);
//获取map中出现次数相等的并移除
for (int i = 0; i < list.size() && i < 10; i++) {
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue().equals(list.get(i))) {
System.out.println(entry.getKey() + " : " + entry.getValue());
map.remove(entry.getKey());
break;
}
}
}
思考及找资料过程:
思路 第一个 统计 非中文 字符 方法 查资料 中文 ascii 码范围 if(19968 <= c && c<40869)
4.代码规范制定链接
5.设计与实现过程
计算模块接口的设计与实现过程。 设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?说明你的算法的关键(展示出项目关键代码),并解释思路,以及独到之处。(20')
6.性能改进
这是最初始的代码,很多条件都没有考虑,简略的写一下,参考过许多人的思路。
public class wordcount {
public static void main(String[] args) throws Exception{
Scanner input=new Scanner(System.in);
System.out.println("请输入路径");
String path=input.next();
int charNum= 0 ;
int wordsNum= 0;
int lineNum = 0;
InputStreamReader isr = new InputStreamReader(new FileInputStream(path));
BufferedReader br = new BufferedReader(isr);
while( br.read()!= -1){ //-1 代表为空文件 如果不为空就执行下面执行体
String s = br.readLine(); //读取一行
charNum+=s.length(); //字符数的叠加
wordsNum +=s.split(" ").length; //调用split分割字符串 获取单词长度
lineNum ++;
}
isr.close();//关闭
System.out.println("字符数:"+charNum+" 单词数:"+wordsNum+"行 数:"+lineNum);
}
}
7.单元测试
计算模块部分单元测试展示。
8.异常处理说明
9.心路历程与收获
很久没有敲代码了,大部分都忘记了,再加上对于未来的道路有了不一样的选择,作业对我而言简直是难上加难。太难受了,最后的完成,离不开大佬的指导。