Fork me on GitHub

201671030102陈飞 《英文文本统计分析》结对项目报告

博文简要信息表

项目

内容

该作业所属课程

软件工程

这个作业的要求出处

实验四 软件工程结对项目

课程学习目标

熟悉软件开发整体流程,提升自身能力

本次作业在哪个具体方面帮助我们实现目标

第一次体验一个完整的工程


###点评信息

点评博客:

201671030102201671030107词频统计软件项目报告

Github链接地址:

源码地址

点评内容:

博文结构较规范,但是内容有一部分并没有提到。比如程序结构(即类名),流程图都没有看见。就PSP而言,我们并没有培养出写规划的习惯,以至于如计划时间过短、生成文档时间过程等问题是无法避免的。 从代码来看,代码机构划分不明显,但功能基本实现。人机交互界面较为空难。

点评心得:

在读取代码之后发现了,使用hashmap这个存储结构能够极大的提升程序处理文件的速度,由于我使用泛型数组导致程序运行速度较慢


###源码地址 源码可于[此处](https://github.com/CF1659696561/Chenfei)查看
###结对项目实施过程 需求分析 根据实验四 软件工程结对项目所提要求,我们分析的主要需求有:          a. 可处理任意用户输入的任意英文文本功能;          b. 统计该文本的行数和字符数功能          c. 指定单词词频统计功能;          d. 前k个高频词统计功能;          e. 统计该文本所有单词数量及词频数,并能将单词及词频数按字典顺序输出到文件result.txt功能          f. 统计时计时功能;          g. GUI人机交互界面;          h. 统计文本中除冠词、代词、介词之外的高频词;
###软件设计 在第二次实验中,我没有将各功能分开分别在几个类中实现,所以这一次吸取了上一次的经验教训 该软件共有10个类:          1. frequency.java类用于调用文本输入界面MainWindows.java类;          2.MainWindows.java类用于实现文本输入界面,当输入一个文本名时如果存在,则顺利进入功能选择并实现界面OneWindows.java类,否则,弹出文件不存在的提示框;          3. OneWindows.java类利用JFrameButton功能实现对各功能选择界面的监听,当获取到各按钮的id之后将实现各功能的界面,默认的界面是ChuLi.java类,当点击按值排序的按钮时调用GaoPin.java类,当点击查询单词的按钮时调用px.java类,当点击保存退出的按钮时将所有单词按照字母表顺序存放到result.txt文件中,将除了介词、代词、冠词以外的其余词汇按照词频从高到底的顺序保存到result1.txt文件中,之后弹出提示信息:“文件已经将除了介词、代词、冠词之外的单词按词频高低保存到result1.txt中\n将所有的单词按字典顺序保存到result.txt中\n注:此处为附加任务一所得结果”;          4. ChuLi.java类所实现的处理信息,包括:文本名、文本行数、文本字符数、分离文本中的单词并统计各单词词频所花费的时间;          5. px.java类用于实现输入需要输出的高频词汇的个数,点击确认后,会将按照词频从高到低的顺序输出到OneWindows.java类的界面中;          6. GaoPin.java类用于实现从OneWindows.java类获取一个字符串,然后调用WordQuery.java类类对该字符串进行处理;          7. wordQuery.java类用于将需要查询的特殊词对应的词频输出并且将其绘制成JFrame所实现可视化柱状图;          8. SortMapByValue.java类根据映射的值排序,排序后可根据用户输入的k值进行输出          9. SortMapByValue.java类根据映射的键排序,排序后将单词以及单词对应的词频保存至result.txt文件中          10.TongJiGaoPinCi.java类用于实现除了介词、代词、冠词之外的其它词以及其对应的高频词保存至result1.txt文件中。
###核心功能代码段展示 输入文本名界面,若文本不存在,则弹出提示框,否则处理文本并计时: ``` JLabel l1=new JLabel("请输入文件名"); j1.add(l1); JTextField FileName =new JTextField(15); j2.add(FileName); JButton en=new JButton("确认"); j3.add(en); this.add(j1); this.add(j2); this.add(j3); en.addActionListener(event ->{ Filename=FileName.getText(); if(Filename.length()==0) { FileName.setText("文件名不能为空!"); } else { long date1=System.currentTimeMillis(); String regex = "[1234567890”“…—‘’ 【】、.。,,。\"!--;:?\'\\]]"; try { // 读取要处理的文件 File f=new File(Filename); if(!f.exists()) { JOptionPane.showMessageDialog(null, "文件不存在", "警告", JOptionPane.ERROR_MESSAGE); FileName.setText(""); } else { this.setVisible(false); BufferedReader br = new BufferedReader(new FileReader(Filename));
		            String value;
		            while ((value = br.readLine()) != null) {
		            	hang++;
		            	zifu+=value.length();
		                value = value.replaceAll(regex, " ");
		                // 使用StringTokenizer来分词
		                StringTokenizer tokenizer = new StringTokenizer(value);
		                while (tokenizer.hasMoreTokens()) {
		                    String word = tokenizer.nextToken();
		                    if (!hashMap.containsKey(word)) {
		                        hashMap.put(word, new Integer(1));
		                    } else {
		                        int k = hashMap.get(word).intValue() + 1;
		                        hashMap.put(word, new Integer(k));
		                    }
		                }
		            }
		            br.close();
		            long date2=System.currentTimeMillis();
		            time=date2-date1;
		            OneWindows o=new OneWindows();
					o.setVisible(true);
				    o.setSize(600,300);
				    o.setLocation(300,200);
				    o.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		        }
不同功能根据按钮所获取的id来弹出相应的用户界面
	ChuLi c=new ChuLi();
	this.add(c,BorderLayout.CENTER);
	c.setVisible(true);
	GaoPin g=new GaoPin();
	px p=new px();
	
	b1.addActionListener(event ->{
		this.add(c,BorderLayout.CENTER);
		c.setVisible(true);
		g.setVisible(false);
		p.setVisible(false);
	});
	b2.addActionListener(event ->{
		this.add(p,BorderLayout.CENTER);
		p.setVisible(true);
		g.setVisible(false);
		c.setVisible(false);
	});
	b3.addActionListener(event ->{
		this.add(g,BorderLayout.CENTER);
		g.setVisible(true);
		c.setVisible(false);
		p.setVisible(false);
	});
	b4.addActionListener(event ->{
		g.setVisible(false);
		c.setVisible(false);
		p.setVisible(false);
		TongJiGaoPinCi.tongjigaopinci();
		JOptionPane.showMessageDialog(null, "文件已经将除了介词、代词、冠词之外的单词按词频高低保存到result1.txt中\n将所有的单词按字典顺序保存到result.txt中\n注:此处为附加任务一所得结果", "保存", JOptionPane.ERROR_MESSAGE);
		System.exit(0);
	});

<br>
###<b>程序运行</b>
<b>文本处理功能,文本行数、字符数统计功能,词频统计所耗费的毫秒数功能(即计时功能):</b>
![](https://img2018.cnblogs.com/blog/1616076/201904/1616076-20190401234735143-657868961.jpg)

<b>文本未找到时弹出提示框功能:</b>
![](https://img2018.cnblogs.com/blog/1616076/201904/1616076-20190401235000673-1399938191.jpg)

<b>按值排序功能:</b>
![](https://img2018.cnblogs.com/blog/1616076/201904/1616076-20190401234820744-1490947940.jpg)

<b>查找单词并绘制柱状图功能:</b>
![](https://img2018.cnblogs.com/blog/1616076/201904/1616076-20190401234912230-675408109.png)

<b>保存并退出功能(将除了介词、代词、冠词的单词按照词频的高低顺序保存到result1.txt文件中,将所有单词按照字母表顺序保存到result.txt文件中):</b>
![](https://img2018.cnblogs.com/blog/1616070/201904/1616070-20190402155833532-2039325009.jpg)


<b>result.txt文件的内容:</b>
![](https://img2018.cnblogs.com/blog/1616076/201904/1616076-20190401235636400-1396849757.jpg)

<b>result1.txt文件的内容:</b>
![](https://img2018.cnblogs.com/blog/1616076/201904/1616076-20190401235710359-249117019.jpg)

<br>
###<b>结对照片</b>
![](https://img2018.cnblogs.com/blog/1616070/201904/1616070-20190402164218906-698483119.jpg)


<br>
###<b>结对作业的PSP</b>
<table style="width: 549px;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="152">
<p align="left">PSP2.1</p>
</td>
<td valign="top" width="170">
<p align="left">任务内容</p>
</td>
<td valign="top" width="113">
<p align="left">计划共完成需要的时间(min)</p>
</td>
<td valign="top" width="113">
<p align="left">实际完成需要的时间(min)</p>
</td>
</tr>
<tr>
<td valign="top" width="152">
<p align="left"><strong>Planning</strong></p>
</td>
<td valign="top" width="170">
<p align="left"><strong>计划</strong></p>
</td>
<td valign="top" width="113">
<p align="center">10</p>
</td>
<td valign="top" width="113">
<p align="center">8</p>
</td>
</tr>
<tr>
<td valign="top" width="152">
<p align="left">Estimate</p>
</td>
<td valign="top" width="170">
<p align="left">估计这个任务需要多少时间,并规划大致工作步骤</p>
</td>
<td valign="top" width="113">
<p align="center">8</p>
</td>
<td valign="top" width="113">
<p align="center">6</p>
</td>
</tr>
<tr>
<td valign="top" width="152">
<p align="left"><strong>Development</strong></p>
</td>
<td valign="top" width="170">
<p align="left"><strong>开发</strong></p>
</td>
<td valign="top" width="113">
<p align="center"><strong>120</strong></p>
</td>
<td valign="top" width="113">
<p align="center"><strong>150</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="152">
<p align="left">Analysis</p>
</td>
<td valign="top" width="170">
<p align="left">需求分析 (包括学习新技术)</p>
</td>
<td valign="top" width="113">
<p align="center">6</p>
</td>
<td valign="top" width="113">
<p align="center">10</p>
</td>
</tr>
<tr>
<td valign="top" width="152">
<p align="left">Design Spec</p>
</td>
<td valign="top" width="170">
<p align="left"> 生成设计文档</p>
</td>
<td valign="top" width="113">
<p align="center">15</p>
</td>
<td valign="top" width="113">
<p align="center">26</p>
</td>
</tr>
<tr>
<td valign="top" width="152">
<p align="left">Design Review</p>
</td>
<td valign="top" width="170">
<p align="left">设计复审(和同事审核设计文档)</p>
</td>
<td valign="top" width="113">
<p align="center">4</p>
</td>
<td valign="top" width="113">
<p align="center">5</p>
</td>
</tr>
<tr>
<td valign="top" width="152">
<p align="left">Coding Standard</p>
</td>
<td valign="top" width="170">
<p align="left"> 代码规范(为目前的开发制定合适的规范)</p>
</td>
<td valign="top" width="113">
<p align="center">5</p>
</td>
<td valign="top" width="113">
<p align="center">4</p>
</td>
</tr>
<tr>
<td valign="top" width="152">
<p align="left">Design</p>
</td>
<td valign="top" width="170">
<p align="left"> 具体设计</p>
</td>
<td valign="top" width="113">
<p align="center">10</p>
</td>
<td valign="top" width="113">
<p align="center">15</p>
</td>
</tr>
<tr>
<td valign="top" width="152">
<p align="left">Coding</p>
</td>
<td valign="top" width="170">
<p align="left">具体编码</p>
</td>
<td valign="top" width="113">
<p align="center"><strong>240</strong></p>
</td>
<td valign="top" width="113">
<p align="center"><strong>300</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="152">
<p align="left">Code Review</p>
</td>
<td valign="top" width="170">
<p align="left">代码复审</p>
</td>
<td valign="top" width="113">
<p align="center">10</p>
</td>
<td valign="top" width="113">
<p align="center">9</p>
</td>
</tr>
<tr>
<td valign="top" width="152">
<p align="left">Test</p>
</td>
<td valign="top" width="170">
<p align="left">测试(自我测试,修改代码,提交修改)</p>
</td>
<td valign="top" width="113">
<p align="center">20</p>
</td>
<td valign="top" width="113">
<p align="center">25</p>
</td>
</tr>
<tr>
<td valign="top" width="152">
<p align="left"><strong>Reporting</strong></p>
</td>
<td valign="top" width="170">
<p align="left"><strong>报告</strong></p>
</td>
<td valign="top" width="113">
<p align="center">9</p>
</td>
<td valign="top" width="113">
<p align="center">6</p>
</td>
</tr>
<tr>
<td valign="top" width="152">
<p align="left">Test Report</p>
</td>
<td valign="top" width="170">
<p align="left">测试报告</p>
</td>
<td valign="top" width="113">
<p align="center">10</p>
</td>
<td valign="top" width="113">
<p align="center">8</p>
</td>
</tr>
<tr>
<td valign="top" width="152">
<p align="left"> Size Measurement</p>
</td>
<td valign="top" width="170">
<p align="left">计算工作量</p>
</td>
<td valign="top" width="113">
<p align="center">2</p>
</td>
<td valign="top" width="113">
<p align="center">2</p>
</td>
</tr>
<tr>
<td valign="top" width="152">
<p align="left"> Process Improvement Plan</p>
</td>
<td valign="top" width="170">
<p align="left">事后总结,并提出过程改进计划</p>
</td>
<td valign="top" width="113">
<p align="center">3</p>
</td>
<td valign="top" width="113">
<p align="center">3</p>
</td>
</tr>
</tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;根据PSP表可以看到,我们在开发和编码的时候实际时间远多于计划时间,这是由于在开发和编码的过程中,JFrame图形用户界面的好多知识点已经忘了,所以在开发和编码的过程中需要不断在网上和教材上去查找和重新学习相关的知识点,所以耗费的时间比较多。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在此次开发过程中发现,不同的人有不同的编程风格,而且在不理解别人风格的情况下是很难进行沟通的
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当然,实验二中存在的处理后文本有非单词的情况和没有面向对象的思想的问题,在这次的实验中也有努力的解决。
posted @ 2019-04-02 15:46  飞-F  阅读(289)  评论(2编辑  收藏  举报