软工第二次作业

软工第二周作业

这个作业属于哪个课程 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
原文地址:https://www.cnblogs.com/neir/p/14608682.html