项目 | 内容 |
---|---|
作业所属课程 | http://www.cnblogs.com/nwnu-daizh/ |
作业要求 | https://www.cnblogs.com/nwnu-daizh/p/10569690.html |
课程学习目标 | 体验软件项目开发中的两人合作,练习结对编程(Pair programming)。掌握Github上增量发布软件的操作方法。 |
在哪个具体方面帮助我们实现目标 | 能够在同学之间更好的进行合作与交流 |
本次项目源代码 | https://github.com/Lxiaoxue/Work |
任务一
项目 | 内容 |
---|---|
点评作业的博客 | https://www.cnblogs.com/shl0/p/10556765.html |
github链接地址 | https://github.com/SHL0/Word-Count |
博文评论内容: | 整体来说写的挺好,功能方面也都基本实现了。在按字典排序写入result.txt文件功能实现的不错,写入的很整齐。但是在查询单词这个功上还可以进行优化,连续输入不同的单词一次性查询。还有就是可以学习一下在博文中如何使用表格。继续努力! 在代码方面,代码写的很规范,能容易理解,每个类和函数都有注释,是值得学习的地方。希望继续努力。 |
点评心得: | 在看了她的博文之后,相比与自己在有些方面还是很有学习的地方,比如在写入result文件中,写入的很整齐。应该学习。 在看了她的代码之后,相比与自己 还有学习的地方,有些代码写注释很重要,方便以后的学习。 |
任务二
a.需求分析
(1)实验2要求的功能;
(2)单词频数可视化柱状图要求是以下样式:
(3)统计该文本行数及字符数;
(4)各种统计功能均提供计时功能,显示程序统计所消耗时间(单位:ms);
(5)可处理任意用户导入的任意英文文本;
(6)人机交互界面要求GUI界面(WEB页面、APP页面都可);
(7)附加分功能:统计文本中除冠词、代词、介词之外的高频词;
b.软件设计
1.首先输入任意正确的文件名。进入功能选择,点击每个功能进行测试。
2.本次项目需要用到图形用户界面。在Mianclass类中编写,设置面板,动作监听。
3.在柱状图和排序编写到不同的类中进行调用。
c.核心功能代码展示
界面按钮监听及输入文件名进行获取时间。
surebt.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
if(event.getSource()==surebt){
JOptionPane.showConfirmDialog(null, "是否退出程序?","查找结果",JOptionPane.DEFAULT_OPTION);
frame1.dispose();//销毁当前界面
}
}
});
okbt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(e.getSource()==okbt) {
String src = t1.getText();
File file =new File(src);
FileReader reader = null;
try {
reader = new FileReader(src);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if(!file.exists())
{
JOptionPane.showConfirmDialog(null, "请输入正确的文件名","查找结果",JOptionPane.DEFAULT_OPTION);
}
BufferedReader br = new BufferedReader(reader);
String readline = null;
int row=0;
int wordnumber=0;
long startTime = System.currentTimeMillis(); //获取开始时间
ArrayList<String> lists = new ArrayList<String>();
try {
while ((readline = br.readLine()) != null)
{
String[] wordsArray=readline.split("[^a-zA-Z]");
for(String word :wordsArray)
{
if(word.length() != 0)
{
word=word.toLowerCase();
lists.add(word);
}
}
row++;
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println(row);
try {
br.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
wordMap=new HashMap<String,Integer>();
for (String l : lists)
{
if(wordMap.get(l) != null)
{
wordMap.put(l,wordMap.get(l) + 1);
}else
{
wordMap.put(l,1);
}
wordnumber++;
}
long endTime = System.currentTimeMillis(); //获取结束时间
JOptionPane.showConfirmDialog(t1, "文本统计完成!"+"
文本统计所消耗时间:"+ (endTime - startTime)+"
文本行数有:"+row+" 单词数:"+wordnumber,"结果",JOptionPane.DEFAULT_OPTION);
}
}
});
柱状图
public class Graph extends Wordcount{
ChartPanel frame1;
public Graph(Map<String, Integer> Map1,String s1){
DefaultCategoryDataset dataset = getDataSet(Map1,s1);
JFreeChart chart = ChartFactory.createBarChart3D(
"单词频数", // 图表标题
" ", // 目录轴的显示标签
// "数量", // 数值轴的显示标签
"单词表",
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
false, // 是否生成工具
false // 是否生成URL链接
);
//从这里开始
CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象
CategoryAxis domainAxis=plot.getDomainAxis(); //水平底部列表
domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12)); //垂直标题
ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状
rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15));
chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 15));
chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体
frame1=new ChartPanel(chart,true); //这里也可以用chartFrame,可以直接生成一个独立的Frame
}
}
public DefaultCategoryDataset getDataSet(Map<String, Integer> Map,String s) {
Map<String,Integer> Map2 = new TreeMap<String, Integer>();
String[] word= s.split(",");
for(int i=0; i<word.length; i++) {
for(Entry<String,Integer> entry : Map.entrySet()) {
if(word[i].equals(entry.getKey()))
{
Map2.put(entry.getKey(), entry.getValue());
break;
}
}
}
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
Set<Entry<String,Integer>> mapEntrySet = Map2.entrySet();
for(Entry<String,Integer> entry : Map2.entrySet()) {
Integer value=entry.getValue();
dataset.setValue((Number)value,entry.getKey(),entry.getKey());
}
return dataset;
}
public ChartPanel getChartPanel(){
return frame1;
}
}
d.程序运行
1.运行程序
2.输入任意文本
(若输入的文件名不正确)
(输入正确的文件名)
3.输入任意单词,查询词频。
4.查询高频词。
5.显示柱状图。
6.按字典排序写如result.txt中。
7.附加功能1,查询除代词介词冠词之外的单词词频。
8.退出。
e.结对过程描述
在一起合作的时候也会有很多分歧,需要讨论和尝试很多次话费许多的时间。在遇到困难时我们会首先进行查阅书籍,然后一起讨论解决方法。尝试各自的方法,选择最好的方法。
f.PSP展示
任务内容 | 计划完成需要的时间(min) | 实际完成需要的时间(main) |
---|---|---|
计划 | 30 | 25 |
估计这个任务需要多少时间,并规划大致工作步骤 | 40 | 30 |
开发 | 240 | 300 |
需求分析 | 30 | 25 |
生成设计文档 | 60 | 50 |
设计复审 (和同学审核设计文档) | 20 | 25 |
代码规范 (为目前的开发制定合适的规范) | 10 | 15 |
具体设计 | 30 | 30 |
具体编码 | 300 | 350 |
代码复审 | 20 | 25 |
测试(自我测试,修改代码,提交修改) | 20 | 15 |
报告 | 30 | 45 |
测试报告 | 30 | 25 |
计算工作量 | 20 | 15 |
事后总结 ,并提出过程改进计划 | 60 | 45 |
g.总结
本次项目的重难点就是图形用户界面,在功能部分我们实现的还算是顺利。但是到了做界面的时候就遇到了很大的困难,虽然之前学习过,大部分方法都忘记了,在编写代码的过程中查阅了书籍。这次项目是结对完成的完成的还可以,在两个人的合作中也体会到了交流的重要性,我们合作的很顺利。希望可以在编程方面更进一步。