这个作业属于哪个课程 | 软工-2018级计算机二班 |
---|---|
这个作业要求在哪里 | 20210326-软件工程作业-3-编程作业 |
这个作业的目标 | 熟悉并掌握gitee |
学号 | 20188456 |
其他参考文献 | 腾讯C++代码规范 |
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟 | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 15 |
Estimate | 估计这个任务需要多少时间 | 500 | 650 |
Development | 开发 | 800 | 1200 |
Analysis | 需求分析 (包括学习新技术) | 80 | 140 |
Design Spec | 生成设计文档 | 60 | 90 |
Design Review | 设计复审 | 10 | 15 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 10 |
Design | 具体设计 | 60 | 80 |
Coding | 具体编码 | 350 | 450 |
Code Review | 代码复审 | 30 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | ||
Reporting | 报告 | 60 | 80 |
Test Repor | 测试报告 | ||
Size Measurement | 计算工作量 | 50 | 50 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 60 |
合计 | 1260 | 2880 |
gitee仓库地址
解题思路描述
要求统计input.txt中的几个指标:
1>,统计文件的字符数;
2>,统计文件的单词总数;
3>,统计文件的有效行数;
4>,统计文件中各单词的出现次数;
单词是一步步来处理的
实现统计字符数,是较为简单的功能,通过文件流读取字符,特殊字符特殊处理;
实现统计单词数,是较为复杂的功能,通过设置状态位canbeword(每次增加,当最后大于四的时候成立)、canbetransferred(当上一个是‘\’,则可能是控制符)等,来处理一系列特殊情况。
实现统计行数,以实现设置状态位来处理大部分情况;
实现统计文件单词出现次数,是打算设置定义string单词和定义整型变量frequency并存于hashMap中,再通过将hashMap排序,以此输出前十位的频率排序;
代码规范指定链接
设计与实验过程
接口类设计
class Lib {
int chcount; //字符总数
int wordcount; //单词总数
int linecount; //行总数
String finname;
String foutname;
Map<String, Integer > hashMap = new HashMap<String, Integer>();
characterCount();//字符统计
wordCount();//单词和行统计
wordOccMax();//单词出现最多频率
outFile(String fname, String str);//输出
字符统计characterCount();
canbetransferred用来处理可能为\n\r的情况,因为按照要求'\n'、'\r'在被读取进来时是连续两个字符,而我们每次只读一个字符。为了处理这种情况,于是当读入为'',进入(if 1),我们将canbetransferred设置为1,表示有可能出现'\n'、'\r'的情况,当下一次读入时,由于上一次canbetransferred被置为1,则进入(if 2),判断下一个是不是n或r再进行处理。
while ((i = br.read()) != -1) {
ch = (char)i;
chcount++; //字符统计
if ((i == 92)) { //(if 1)
canbetransferred = 1;
}
if (canbetransferred == 1) { //(if 2)
canbetransferred = 0;
if (ch == 'n' || ch == 'r') {
chcount--;
continue;
}
}
}
单词统计和行统计wordCount();
设置的一下状态符合思路。
int canbeword = 0; //当为0时遇到字母每次增加,前四个有非字母就置0,当最后大于四的时候说明前四个都是字母
int canbetransferred = 0;//可能为\n\r
int linechcount = 0; //统计每行字符,不为空字符则++,为空不能算一行
String tempword = ""; //存放临时字符串
因为仅在换行和出现分割符时,word数量才会相加,通过!Character.isLetter(ch) && !Character.isDigit(ch))判断ch是否为分割符,分下列两种情况:
一、ch为'',
1、判断tempword是否可为word(通过canbeword是否为4),若是则加入hashmap, 且wordcount++;2、将tempword、canbeword重置;3、将canbetransferred = 1;4、continue,进入下一层判断是否为'r'或'n' ;
二、ch不为''
1、判断tempword是否可为word(通过canbeword是否为4),若是则加入hashmap, 且wordcount++; 2、将tempword、canbeword重; 3、continue,进入下一层判断是否为'r'或'n'
换行统计主要代码
if (linechcount != 0) {
linecount++;
}
linechcount = 0;
前10单词出现最多频率wordOccMax()
思路与单词数统计差不多,当可为一个单词时,就存入hashMap。最后再统计。
存入HashMap的代码:
if (hashMap.containsKey(tempword)) {
Integer hvalue = ((Integer)hashMap.get(tempword))+1;
hashMap.put(tempword, hvalue);
}else {
hashMap.put(tempword, 1);
}
排序代码,先按value,value相同,再按key:
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
int re = o2.getValue().compareTo(o1.getValue()); //重写排序规则,小于0表示升序,大于0表示降序
if (re != 0) {
return re;
}else {
return o1.getKey().compareTo(o2.getKey());
}
}
输入结果示例:
运行结果示例:
异常处理说明
1>、数组越界问题,采用了ArrayIndexOutOfBoundsException进行异常处理。
2>、输入输出流问题,采用了IOException进行异常处理。
新路历程与收获
这次作业是个人第二次作业,主要考验了学生自我编程能力及gitee的使用,通过完成作业,了解到自己还存在很大的不足,革命还在继续,同志仍需努力。