软工网络16个人作业2

1、码云项目地址

个人码云地址

2、PSP表格

PSP2.1个人开发流程预估耗费时间(分钟)实际耗费时间
Planning计划3545
· Estimate明确需求和其他相关因素,估计每个阶段的时间成本4055
Development开发400450
· Analysis需求分析 (包括学习新技术)100120
· Design Spec生成设计文档5060
· Design Review设计复审6090
· Coding Standard代码规范4560
· Design具体设计3030
· Coding具体编码120150
· Code Review代码复审3030
· Test测试(自我测试,修改代码,提交修改)2540
Reporting报告6075
·测试报告3545
·计算工作量4040
·并提出过程改进计划3030

3、解题思路概述

1、首先审题!

题目:实现一个统计程序(控制台),它能正确统计程序文本文件中的字符数、单词数、行数,第一眼看过去的反应是需要用到文件相关的知识,之前有做过相似的java练习,所以脑子里面便有了基本的思路。再者,java是大二上学习的,才过一个学期,记得的相关知识更多。于是,选择java语言进行开发。

2、具体分析

在初步审题之后,有了基本思路,现在来进行一些具体功能实现的分析,这个控制台程序的主要功能有:统计字符数统计有效单词数统计有效行数词频统计文件处理,对于单词统计,涉及java中的split()方法,将分割后的单词放入字符串数组中,重点在词频,要涉及Map相关的知识(复习之前java的练习),之后,需要加的功能之后再具体研究。对于统计字符数,直接就是返回长度(length或size)的方法。先打造出一个框架,之后如有需要改进功能或者添加功能,再进行改进。


4、设计实现过程

1、相关类和函数的设计

定义了一个charCount类,其中定义了三个方法,sortMap方法(实现单词排序),wordCount方法(实现词频统计),Output方法(实现写文本文件处理),没有各自分成专门的类,就只是设计了这三个方法。对于行数和字符数的统计没写成函数。

2、关键函数流程图

1121429-20180916222334108-555970101.png

1121429-20180916222344140-642086174.png


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、是否有按字典顺序进行输出

1121429-20180917190333961-22745735.png

1.2、无效行,有效行处理

1121429-20180917190422422-1416315783.png

1.3、判断是否为单词

1121429-20180917190432800-807168453.png

其中file123判定为单词,而1file不是(必须以四个英文字母开头)

2、使用Junit测试

1121429-20180917193808317-553663294.png

3、代码覆盖率

1121429-20180921125029312-957026747.png


7、结合在构建之法中学习到的相关内容与个人项目的实践经历,撰写解决项目的心路历程与收获

    通过这次的个人项目训练,发现了整体规划和统筹的重要性。之前做题目的习惯就是从一开始拿到题目,就开始埋头写代码。但是这次的个人项目要求按照一个标准的项目步骤来进行开发,所以整个流程下来,我做的不是很流畅。在代码开发过程中,也遇到了一些问题,单词分割的具体要求(单词以4个英文字母开头),一开始没注意看具体要求,导致后面统计出错。但是总的来说,基本框架还是比较清晰,基本上实现了功能,遗憾的是在大小写的处理上还需改进。对这次的项目开发来说,我个人的收获还是蛮大的,通过自己查找阅读资料,也能解决一些问题,要改进提升的地方还是非常多的,认识到自己的不足之处。此次个人项目花费的时间和我自己预估的时间还是有很大的差异(但可能是第一次做,时间预估也不会那么准确),第一次感受熟悉开发项目的流程如何,相信对之后的结对开发和团队合作会很有帮助,接下来仍需提升自身素质在团队中发挥出自己的作用!

转载于:https://www.cnblogs.com/kyrie/p/9657744.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值