软工第二次作业
软工第二周作业
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zswxy/computer-science-class1-2018 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/computer-science-class1-2018/homework/11877 |
这个作业的目标 | 理解如何在实战中运用软件工程这门学科的知识 |
其他参考书籍 | 《码出高效_阿里巴巴Java开发手册》/《腾讯c++代码规范》/《Python PEP8》 《廖雪峰git教程》 |
1、git项目代码地址
https://gitee.com/sunzeliang/project-java/tree/master/
https://gitee.com/sunzeliang/project-java
2、代码规范制定链接
https://gitee.com/sunzeliang/project-java/blob/master/20188413/codestyle.md
3、解题思路与设计实现过程
1、统计文件的字符数
根据编码判断每个字符是不是我们所需要的。
2、统计文件的单词总数
采用正则表达式
3、统计文件的行数
通过readLine()获取行数
并识别换行符
4、统计单词频率,并输出频率最高的10个
在分割出单词之后,将单词遍历储存在hashmap当中,在储存前先判断是否为合法单词
将map的遍历储存在set当中
统计字符个数
while((value = bReader.read()) != -1) {
if (value >= 0 && value<=255) {
charcount++; 4 }
}
统计单词
while ((line = bufferedReader.readLine()) != null) {
String[] words = line.split("[^a-zA-Z0-9]+");
for (String word : words) {
word.toLowerCase();
if (word.matches("[a-zA-Z]{4}[a-zA-Z0-9]*") ) {
countword++;
}
}
}
统计文件行数
while ((line = bufferedReader.readLine()) != null) {
if (line.length() != 0 && !line.matches("\\s+")) {
linecount++;
}
}
得出单词频率最高的十个单词
在分割出单词之后,将单词遍历储存在hashmap当中,在储存前先判断是否为合法单词
String str=st.nextToken();
str = str.toLowerCase();
if ((str.charAt(0) >= '9' || str.charAt(0) <= '0') && str.length() >= 4) {
if(map.containsKey(str))
map.put(str, map.get(str)+1);
else map.put(str, 1);}
将map的遍历储存在set当中
Set<WordEntity> set=new TreeSet<WordEntity>();
for(String s:map.keySet()){
WordEntity wordEntry=new WordEntity(s,map.get(s));
set.add(wordEntry);
}
Iterator<WordEntity> ite=set.iterator();
int count=0;
while(ite.hasNext()){
if(count>=10)
break;
System.out.println(ite.next());
count++;
}
性能改进
从最初的暴力解决一步步改善用hashmap存储对单词的遍历,map的遍历存储在set中,排序 TreeSet,对wordEntity实现comparable接口重写compareTo()和toString()。
@Override
public String toString() {
writeInTxt.writeTxt( "<" + word + ">:" + count);
return "<" + word + ">:" + count;
}
@Override
public int compareTo(WordEntity O) {
int cmp=count.intValue()-O.count.intValue();
return (cmp==0?word.compareTo(O.getKey()):-cmp);
}
接口
public interface WordCount {
/**
* 返回行数
* @param filename
* @return
* @throws IOException
*/
int linesCount(String filepath) throws IOException;
/**
* 返回合法单词数
* @param filepath
* @return
* @throws IOException
*/
int wordsCount(String filepath) throws IOException;
/**
* 返回字符数
* @param filepath
* @return
* @throws IOException
*/
int charsCount(String filepath) throws IOException;
/**
* 词频前十的单词
* @param filepath
* @throws IOException
*/
void wordDetail(String filepath) throws IOException;
}
单元测试
代码覆盖率
异常处理说明
try{
可能发生异常的代码块
}catch(异常1){
处理异常1的代码
}
计算模块异常,可能导致文件不存在。
心路历程与收获
对于本次作业还感到自己有很多的不足之处,还需努力学习,对于一些技术的用法还掌握的不够。还得深造。而且在完成本次作业的时候,感觉很吃力。没有之前那么轻松了,这次真正认识到的书到用时方恨少。
也感受到了平时学习和积累的重要性。通过这次之后,我会挤出一部分课余时间来进行课外知识的学习。对于java的学习更要努力了。不过对git的指令越来越熟悉了。对于一些知识也有了一定的了解。在此次作业之后,
定要回顾一下Java开发实战经典这本书。以及努力学习一下python。
PSP表格
PSP2.1 | Personal Software Process Stages | 预估时间(分钟) | 实际消耗(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 30 |
Estimate | 估计这个任务需要多少时间 | 10 | 20 |
Development | 开发 | 400 | 650 |
Analysis | 需求分析(包括学习新的资料) | 60 | 180 |
Design Spec | 生成设计文档 | 15 | 20 |
Design Review | 设计复审 | 20 | 10 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 10 | 25 |
Design | 具体设计 | 60 | 80 |
Coding | 具体编码 | 300 | 500 |
Code Review | 代码复审 | 20 | 20 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 100 |
Reporting | 报告 | 45 | 70 |
Test Repor | 测试报告 | 10 | 30 |
Size Measurement | 计算工作量 | 15 | 15 |
Postmortem & Process Improvement Plan | 事后总结,并提出过过程改进计划 | 30 | 35 |
合计 | 1075 | 1785 |