软件工程作业3

1、要求地址

2.PSP表格

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

3.基本思路:

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

文件读取之后,将相应的字符、单词、行数等进行计数,并在判断是否为单词后,利用Map实现对单词的词频统计,根据题目中要求进行计算。

对统计出来的数据输出。

4.设计实现过程。

代码组织:

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

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

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

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

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

5、主要函数

  • 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;

5、单元测试

6、效能分析




7、结合在构建之法中学习到的相关内容与结对项目的实践经历,描述结对的感受,是否1+1>2?

  • 实验感受:在这次实验中,由于有上一次的饰演的基础,对原来的代码有了优化,但对于GUI界面的实现,还没有能过够很好的实现,对于这方面的知识还不能很好的实现,这是这次实验中遇到的较大的困难,我会在后面将其补上,在之前所想要实现的功能和自己的能力相悖,所以导致后面界面不能够完全实现,但我一定会克服这一困难。
  • 在这次的结对编程中,由于在之前的结对经验不足,在这次实验中并能很好的分配其中的任务,让这次试验一开始出现了较大的困难,沟通方面出现了一些歧义,不够在后来的实验中慢慢的能够克服,让实验走向正轨,这次实验并没有完成的很好,实际上只能达到1+1=0.9的程度,我们会在后面的实验中做到>2的!
posted @ 2018-10-07 21:45  DansLv  阅读(156)  评论(0编辑  收藏  举报