1、码云项目地址
个人码云地址
2、PSP表格
PSP2.1 | 个人开发流程 | 预估耗费时间(分钟) | 实际耗费时间 |
---|---|---|---|
Planning | 计划 | 35 | 45 |
· Estimate | 明确需求和其他相关因素,估计每个阶段的时间成本 | 40 | 55 |
Development | 开发 | 400 | 450 |
· Analysis | 需求分析 (包括学习新技术) | 100 | 120 |
· Design Spec | 生成设计文档 | 50 | 60 |
· Design Review | 设计复审 | 60 | 90 |
· Coding Standard | 代码规范 | 45 | 60 |
· Design | 具体设计 | 30 | 30 |
· Coding | 具体编码 | 120 | 150 |
· Code Review | 代码复审 | 30 | 30 |
· Test | 测试(自我测试,修改代码,提交修改) | 25 | 40 |
Reporting | 报告 | 60 | 75 |
· | 测试报告 | 35 | 45 |
· | 计算工作量 | 40 | 40 |
· | 并提出过程改进计划 | 30 | 30 |
3、解题思路概述
1、首先审题!
题目:实现一个统计程序(控制台),它能正确统计程序文本文件中的字符数、单词数、行数
,第一眼看过去的反应是需要用到文件相关的知识,之前有做过相似的java练习,所以脑子里面便有了基本的思路。再者,java是大二上学习的,才过一个学期,记得的相关知识更多。于是,选择java
语言进行开发。
2、具体分析
在初步审题之后,有了基本思路,现在来进行一些具体功能实现的分析,这个控制台程序的主要功能有:统计字符数
、统计有效单词数
、统计有效行数
、词频统计
、文件处理
,对于单词统计,涉及java中的split()方法,将分割后的单词放入字符串数组中,重点在词频,要涉及Map相关的知识(复习之前java的练习),之后,需要加的功能之后再具体研究。对于统计字符数
,直接就是返回长度(length或size)的方法。先打造出一个框架,之后如有需要改进功能或者添加功能,再进行改进。
4、设计实现过程
1、相关类和函数的设计
定义了一个charCount类,其中定义了三个方法,sortMap
方法(实现单词排序),wordCount
方法(实现词频统计),Output
方法(实现写文本文件处理),没有各自分成专门的类,就只是设计了这三个方法。对于行数和字符数的统计没写成函数。
2、关键函数流程图
5、代码说明(代码片段)
1、sortMap()函数
public static void sortMap(Map<String,Integer> oldmap){
ArrayList<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(oldmap.entrySet());
Collections.sort(list,new Comparator<Map.Entry<String,Integer>>(){
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
if (o1.getValue() == o2.getValue()) {
return o1.getKey().compareTo(o2.getKey());//词频相同时,按字典排列
}
return o2.getValue() - o1.getValue(); //降序排列
}
});}
这个函数实现了对单词词频的排序。(具体的实现过程在流程图已经呈现出来)
2、wordCount()函数
public static void wordCount( Map<String, Integer> wordsCount,List<String> list1){
int countWord=0;
for (String i : list1) {
if(wordsCount.get(i) != null){
wordsCount.put(i,wordsCount.get(i) + 1);
}else{
wordsCount.put(i,1);
}
countWord++;
}
System.out.println("单词数:"+countWord);
}
这个函数呢,实现了对单词的词频统计,其中稍微解释一下代码,其中有个判断条件wordsCount.get(i) != null
,这个单词是否已经存在在Map类型的List中,若是,则这个单词的value+1,若不是,就将其value置为1。
3、Output()函数
public static void Output(int charCount,int lineCount,List<String> list){
try {
/* 写入Txt文件 */
File writename = new File("d:/doutput.txt"); //如果没有则要建立一个新的output.txt文件
writename.createNewFile(); // 创建新文件
BufferedWriter out = new BufferedWriter(new FileWriter(writename));
PrintStream printStream = new PrintStream(new FileOutputStream(writename));
System.setOut(printStream);
System.out.println("字符数:"+charCount);
System.out.println("有效行数:"+lineCount);
System.out.println("words:"+list.size());
Map<String, Integer> wordsCount1 = new TreeMap<String,Integer>(); //存储单词计数信息,key值为单词,value为单词数
wordCount(wordsCount1,list);
sortMap(wordsCount1);
out.flush(); // 把缓存区内容压入文件
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
这个函数是将相关的信息写入一个文本文件中。异常处理:写文件时若写入文件失败则抛异常。
6、单元测试
1、测试用例(部分)
1.1、是否有按字典顺序进行输出
1.2、无效行,有效行处理
1.3、判断是否为单词
其中file123判定为单词,而1file不是(必须以四个英文字母开头)
2、使用Junit测试
3、代码覆盖率
7、结合在构建之法中学习到的相关内容与个人项目的实践经历,撰写解决项目的心路历程与收获
通过这次的个人项目训练,发现了整体规划和统筹的重要性。之前做题目的习惯就是从一开始拿到题目,就开始埋头写代码。但是这次的个人项目要求按照一个标准的项目步骤来进行开发,所以整个流程下来,我做的不是很流畅。在代码开发过程中,也遇到了一些问题,单词分割的具体要求(单词以4个英文字母开头),一开始没注意看具体要求,导致后面统计出错。但是总的来说,基本框架还是比较清晰,基本上实现了功能,遗憾的是在大小写的处理上还需改进。对这次的项目开发来说,我个人的收获还是蛮大的,通过自己查找阅读资料,也能解决一些问题,要改进提升的地方还是非常多的,认识到自己的不足之处。此次个人项目花费的时间和我自己预估的时间还是有很大的差异(但可能是第一次做,时间预估也不会那么准确),第一次感受熟悉开发项目的流程如何,相信对之后的结对开发和团队合作会很有帮助,接下来仍需提升自身素质在团队中发挥出自己的作用!