201671010404+陈润菊 实验二软件工程项目

一:需求分析:

 1.使用java代码,对存放在java工程下的Word.txt中的所有单词进行统计。
 2.按照需求,将指定单词统计的结果按照要求的方式显示出来(题目要求按照柱形图的形式显示)。
 3.高频单词的统计功能,输入整数K,按照单词的词频数显示前K个数以及单词。
 4.将1中的统计结果写入到result.txt中。
 5.要求代码健壮,代码简介,代码质量高。

二:功能设计:

 1.基本功能:
         a.首先要实现所有单词的统计,为以后找指定单词的统计奠定基础,便于进行比较。
         b.在将所有单词都已统计的基础上,对出现次数最多的单词进行显示,并显示前k个数。(k为输入的正整数)
         c.在指定单词查找成功后,显示出该单词在文章中的出现次数的柱形图。
         d.将基本功能中的统计出的单词的统计结果写入到result.txt中。

三:设计实现:

      我主要设计了两个类,即Test测试类和WordCount统计词数两个类,Test主要是主测试类,它是程序运行的入口,主要是实现各个功能模块的实现,a.指定单词的查找以及其柱形图的显示。b.高频单词的查找。c.将统计结果存放至result中。其次一个类是Wordcount类,它主要实现方法的封装,便于主测试类对其的调用,加强代码的健壮性。 我主要涉及了缓冲流的使用,以及输入输出函数的频繁使用,以及集合的使用,以及可视化界面的应用。

四:测试运行:

1.程序运行截图:
指定单词的查找以及柱形图:

高频词数的统计:

将统计好的单词存放至result.txt中:

五. 粘贴自己觉得比较独特的或满意的代码片段,用博客园正确的代码控件来显示。

              //高频词数的统计以及显示
	          public void two(TreeMap<String,Integer> map,int k){
		       //传入参数k,以及集合map
		        ArrayList<Map.Entry<String,Integer>>  list = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());	//声明集合list	
                         //接口的实现传递给Collections.sort方法      
		        Collections.sort(list,new Comparator<Map.Entry<String,Integer>>(){  
		            public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {  
		                return o2.getValue() - o1.getValue(); 
		              }  
		        }); 
		      //输出前k个数
		      for(int i = 0; i<k; i++){  
		            System.out.println(list.get(i).getKey()+ ": " +list.get(i).getValue());  
		        }     
		    }
	 

  原因:我刚开始在进行高频单词统计的时候,遇到了很多的问题,在网上查找了很多关于排序方法以及资料。刚开始想到简单的排序方法,但是有考虑map集合中的元素是以键值对的形式存放,是比较繁琐的,就想到用比较器Comparator,它能对不同类型的对象进行排序,它排序的依据是基本类型,也不用自己实现排序算法,用起来很方便。对任意类型集合对象进行整体排序,排序时将此接口的实现传递给Collections.sort方法或者Arrays.sort方法排序。在i<k的情况下,即显示的个数小于map中单词的总个数,程序正常运行。之前用的HashMap,List等集合比较多,这次用了TreeMap,主要是它本身就有排序的功能,应用在这里是比较方便的。

六. 总结:你设计的程序如何实现软件设计的“模块化”原则。

我的设计思路:首先,我是以我的Test类为核心,根据老师提出的要求,将其划分成主要的三个模块,根据输入的模块的指定的数字,实现其指定的功能,在WordCount中直接调用已封装好的方法,将各个模块功能封装在另类,减少了代码与代码之间的依赖性和不相关性,提高了代码的独立性,方便以后不会出现修修改改代码的情况,在其他地方应用该功能时,只需要直接调用改方法即可,不需要再修改原码,这样代码会有很强的健壮性和高质量性,便于以后的开发。

七. 展示PSP:这个环节重要的是让自己看到自己的估计和实际消耗时间,哪个环节耗时最多,哪个环节估计和实践相差巨大?为什么?

PSP2.1 任务内容 计划共完成需要的时间(min)
Planning 计划 6
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 10
Development 开发 200
Analysis 需求分析 (包括学习新技术) 3
Design Spec 生成设计文档 5
Design Review 设计复审 (和同学一起审核设计文档) 5
Coding Standard 代码规范 (为目前的开发制定合适的规范) 3
Design 具体设计 14
Coding 具体编码 180
Code Review 代码复审 6
Test 测试(自我测试,修改代码,提交修改) 6
Reporting 报告 10
Test Report 测试报告 6
Size Measurement 计算工作量 5
Postmortem & Process Improvement Plan 事后总结 ,并提出过程改进计划 5

总结:自己这个项目是计划的很顺利,思路很清晰的。但是在实际开发中是还是遇到了很大的问题,在写柱形图这块的时候,确实遇到很大的问题,包括继承JFrame类,以及Paint中一些方法的使用。还有在高频词统计的时候,对比较器的使用,还是不太熟练的,花费了较多的时间。

源代码链接地址:https://github.com/runju/WordCount

原文地址:https://www.cnblogs.com/runju/p/10558809.html