软工网络16个人作业2

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个英文字母开头),一开始没注意看具体要求,导致后面统计出错。但是总的来说,基本框架还是比较清晰,基本上实现了功能,遗憾的是在大小写的处理上还需改进。对这次的项目开发来说,我个人的收获还是蛮大的,通过自己查找阅读资料,也能解决一些问题,要改进提升的地方还是非常多的,认识到自己的不足之处。此次个人项目花费的时间和我自己预估的时间还是有很大的差异(但可能是第一次做,时间预估也不会那么准确),第一次感受熟悉开发项目的流程如何,相信对之后的结对开发和团队合作会很有帮助,接下来仍需提升自身素质在团队中发挥出自己的作用!
posted @ 2018-09-17 19:50  Aning13  阅读(264)  评论(2编辑  收藏  举报