2020软件工程作业01
这个作业属于哪个课程 | 软工-2018级计算机1班 |
---|---|
这个作业要求在哪里 | [https://edu.cnblogs.com/campus/zswxy/computer-science-class1-2018/homework/11877 |
这个作业的目标 | 学习使用GIT或者码云 |
学号 | 20188398 |
文章主体
码云项目地址
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(h) | 实际耗时(h) |
---|---|---|---|
Planning | 计划 | 0.5 | 0.5 |
Estimate | 估计这个任务需要多少时间 | 12 | |
Development | 开发 | 2 | 3 |
Analysis | 需求分析 (包括学习新技术) | 2 | 1 |
Design Spec | 生成设计文档 | 0.5 | 0.5 |
Design Review | 设计复审 | 1 | 0.5 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 1 | 0.5 |
Design | 具体设计 | 2 | 2 |
Coding | 具体编码 | 2 | 2 |
Code Review | 代码复审 | 0.5 | 1 |
Test | 测试(自我测试,修改代码,提交修改) | 2 | 2 |
Reporting | 报告 | ||
Test Repor | 测试报告 | 1 | 2 |
Size Measurement | 计算工作量 | 0.5 | 0.5 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 1 | 1 |
合计 | 16 | 16.5 |
解题思路描述
看完题目描述,马上就想到了HashMap,单词-数量;这不就一键值对嘛。决定用HashMapd话思路就很清晰了,先把文本全读进内存进行一定的处理和判断后一个个单词放进HashMap里面,键为单词字符串,值为频次。
代码规范链接
实现过程
根据遍历来统计字符数思路:一开始的想法是使用java中的正则表达式来匹配ASCII码,后续完成后在无意间发现通过readline会导致换行丢失且出现错误,后续经过验证后对自己的代码进行了修改,在该函数中进行了文件的read操作,并计数进行统计。
BufferedReader bufferedReader = null;
try{
String pre_path=new File("").getAbsolutePath();
bufferedReader = new BufferedReader(
new InputStreamReader(new FileInputStream( pre_path+ "\\" + filepath),"utf-8"));
while((bufferedReader.read())!=-1)
{
char_num+=1;
}
}
catch(...)
if(bufferedReader!=null){
bufferedReader.close();
}
return char_num;
}
统计文件的单词总数思路:题意为获取为字母开头且长度大于4的单词数,使用正则表达式匹配。首先通过String类自带的split方法去拆开整篇文章使其形成一个数组,然后通过正则表达式去选择出正确的单词并作统计。
// 构造正则表达式,去根据空格拆分整篇文章
// temp字符串数组将保存所有的单词
//处理特殊字符,以免被误以为是单词的一部分
String[] temps = words.toString() .split("[^a-zA-Z0-9]");
// 构造题意:以字母开头且长度大于4的单词
String regexs = "^[a-zA-Z]{4,}.*";
// 循环遍历这个数组,利用正则表达式去匹配
for (int i = 0; i < temps.length; i++) {
if (temps[i].matches(regexs)) {
// 匹配成功,计数加1
word_num++;
//System.out.println(temps[i]);
}
}
return word_num;
统计文件的有效行数思路:想通过获取文件中非空行的方式来进行统计,使用BufferdReader来读取文件,将要调用的文件放在src下.通过获取绝对路径的方式并与文件名拼接来查询文件,遍历行数累加。在构建文件对象的时候一开始使用了File直接来构建,发现其编码有误,不是UTF-8,且无法做修改,后续更换了InputStreamReader类型来让指定文件类型。
String pre_path=new File("").getAbsolutePath();
try {
bufferedReader = new BufferedReader(
new InputStreamReader(new FileInputStream( pre_path+ "\\" + path),"utf-8"));
String line;
// 通过循环不断整行读取文件
// 同时记录读取次数即可
while ((line = bufferedReader.readLine()) != null) {
//匹配任意非空白字符
if (line.length() != 0 && !line.matches("\\s+")) {
line_num++;
}
}
} catch (...)
return line_num;
}
统计文件中各单词的出现次数思路:词频统计我用map来存储键值对,首先还是做相同的正则匹配来获取所有单词,然后进行遍历加数,以(单词名,出现次数)键值对存入map中。在排序时构造匿名内部类来重写compare方法,先比较值,如果值相同,则比较键序。并且为了判断字典序再写了一个方法来进行比较。
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
// 构造匿名内部类
// 首先根据频率比较,如果频率相同,比较字典序
list.sort((Comparator<Map.Entry>) (o1, o2)
-> ((Integer) o1.getValue()).compareTo((Integer) o2.getValue()) != 0
? ((Integer) o2.getValue()).compareTo((Integer) o1.getValue()) : getCharNums((String)o1.getKey(),((String)o2.getKey())));
// 返回list 前十个 数据,也即出现的前十的高频词
return list.size() < 10 ? list.subList(0, list.size()) : list.subList(0, 10);
}
文件存取功能思路:分别使用BufferedReader和BufferedWriter来进行文件的存取,增加了缓冲区对于性能有所提高,并且根据题意更换了File并使用InputStreamReader和OutputStreamWriter来替代,从而定义文件的默认编码。
String pre_path=new File("").getAbsolutePath();
try {
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(new FileInputStream( pre_path+ "\\" + path),"utf-8"));
String temp;
while ((temp = bufferedReader.readLine()) != null) {
stringBuilder.append(temp).append("\n");
}
bufferedReader.close();
} catch(...)
return stringBuilder;
}
String pre_path=new File("").getAbsolutePath().toString();
try {
//生成的文件放在当前项目下
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream( pre_path+ "\\" + path),"utf-8"));
bufferedWriter.write(message);
bufferedWriter.flush();
bufferedWriter.close();
} catch (...)
}
计算模块部分异常处理说明
JAVA自动捕获输出异常信息。
心路历程与收获
这次临近放假,所以很多工作做的很匆忙。但还是大体完成了任务要求。