软件工程作业2

1、Fork 码云项目

2.码云项目地址

https://gitee.com/hellolv/PersonalProject-Java

3.PSP表格

PSP2.1 个人开发流程 预估耗费时间(分钟) 实际耗费时间(分钟)
Planning 计划 30 30
· Estimate 明确需求和其他相关因素,估计每个阶段的时间成本 30 50
Development 开发 650 950
· Analysis 需求分析 (包括学习新技术) 50 60
· Design Spec 生成设计文档 20 30
· Design Review 设计复审 40 50
· Coding Standard 代码规范 10 15
· Design 具体设计 45 85
· Coding 具体编码 120 170
· Code Review 代码复审 30 25
· Test 测试(自我测试,修改代码,提交修改) 60 240
Reporting 报告 60 80
· 测试报告 15 10
· 计算工作量 5 5
· 并提出过程改进计划 10 15

4.解题思路

1.确定相关编程语言:Java
2.基本思路:

根据题目的要求,首先需要在对已经建好或导入的文档进行读取,这里就需要有文件读取类,对文件中的所有进行读取。

文件读取之后,将相应的字符、单词、行数等进行计数,根据题目中要求进行计算。

对统计出来的数据输出。

5.设计实现过程。

代码组织:

1.WordC类:对字符数、单词数、行数等进行统计。

  • countChar();统计字符数
  • countWords();统计单词数
  • countLine();统计行数
  • WordFre();实现单词词频统计并出现次数从高到低排列

2.FileRead类:导入需要WordCount的文件,进行文件读取等操作

  • FileOutput();文件读取
  • FileInput();文件写入

3.Main类:实现数据的输出和文件路径的输入,并将WordC类和FileInput类调用,实现功能。

6.代码说明

1、主要函数

  • countChar() : 统计字符数量
public static int countChar(String str) { //统计字符数量
		char s;
		int CharSum=0;
		for (int i = 0; i < str.length(); i++) {
			s=str.charAt(i);
			if (s>=32 && s<=126 || s=='\r' || s=='\n' || s=='\t') {
				CharSum++;
				
			}
		}
		return CharSum;
	}
  • countWords():统计单词数量
	public  int countWords(String[] str) { //统计单词数量
		String str1=text;
		int WordsSum=0;
		String[] words=str1.split("\\s*[^0-9a-zA-Z]"); //调用正则表达式中spilt()方法来切分字段,将字符串中的单词提取出来
		for(String s:words) {
			if(s.matches("[a-zA-Z{4,}[z-zA-Z0-0]*")) { //调用matchs方法来判断这个字符串是否在给定的正则表达式匹配
				WordsSum++;
				
		}
		}
		return WordsSum;
		
		
	}
	
  • countLine :统计行数
	public  static int countLine(String[] str) { //统计行数
		int LineSum=0;
		for (int i = 0; i < str.length; i++) {
			while(str[i]!=null) {
				if(str[i].trim().length()==0 || str[i].trim().equals("")) {
					continue;   //调用trim()方法将头尾空格去掉,来判断行数
				}
				LineSum++;
		return LineSum;
	}
  • WordFre :计算全文的单词词频:
	public List<Entry<String, Integer>> WordFre()
	{
		WordFre= new HashMap<String, Integer>();
		String t = text;
	
		String[] words = t.split("\\s"); // 将字符串进行分割
		
		for (int i = 0; i < words.length; i++) {
				if (isWord(words[i])) { // 判断是否为单词,调用isWord函数
					
					words[i] = words[i].trim().toLowerCase();//将大写字母变成小写字母
					
					
					if (WordFre.get(words[i]) == null) { // 判断之前Map中是否出现过该字符串
						
						
						WordFre.put(words[i], 1);// 如果为新单词,放入map中作为key值,value设为1
						
					} else
						
						WordFre.put(words[i], WordFre.get(words[i]) + 1);//如果出现过的单词则将value值+1
				}
		}
  • 将词频排序用list储存:
List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(WordFre.entrySet());//用list列表储存键值
		
		list.sort(new Comparator<Map.Entry<String, Integer>>() {//对list排序
			
			@Override
			
			public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {	
				
				if (o1.getValue() == o2.getValue()) {//判断词频是否相等
					
					return o1.getKey().compareTo(o2.getKey());//字典序排列
				}
				return o2.getValue() - o1.getValue();//降序排列
			}

		});
		
		return list;

7、单元测试

8、效能分析

效能分析我是用JProfiler进行对代码的分析主要查看的对象、线程、CPU等方面。



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

在这次项目的实战中,有着很大的收获同样的也遇到了许许多多的困难,在实践初期,没有好好制定相应的计划,导致在后面的时间过程中耗费了大量的实践和精力,后面通过查找资料和同学帮助下慢慢的一个一个解决困难,但在单元测试以及词频的统计上还有很大的学习空间,在后面的学习中我会慢慢修改并补充上。这次是第一词进行项目的实战,很多地方没有考虑到,发现自己需要学习的东西还有很多,遇到一些测试和效能分析有些吃力,但我会慢慢提高自己的能力,为后面的项目打好基础,提高自己的各方面实力。

posted @ 2018-09-17 21:53  DansLv  阅读(231)  评论(13编辑  收藏  举报