本次实验要求使用JAVA编程语言,独立完成一个英文文本词频统计的软件开发。
该程序要求实现:html
根据需求分析中提到的内容,本程序中设计如下几个功能:java
程序流程图:
git
本程序包含四个类,包括一个主函数Main.java和三个功能类,分别是Count1.java,Count1.java,Count1.java主程序主要是用来控制程序的整个流程,用户输入不一样的功能选项,来调用这三个功能。三个类的功能分别是:github
选择选项1,显示文件中全部单词个数及其词频统计结果,并将结果输出到指定文件中。
编程
用户任意输入想要在文件中查询的单词,查询并显示结果,若该文件中不存在该单词则提示错误信息。
小程序
用户输入想要查询统计的任意个数K个高频单词,查询成功则显示单词词频及其柱状图
数组
若输入查询个数为不在有效范围内(负数或者大于文中单词类型个数),则提示相应的错误信息。
框架
退出程序,不在输出菜单。
编程语言
String filecontent = "";//用来存放读取到的文件内容信息 //用键值对分别存储单词和它出现的次数 Map<String,Integer> map = new HashMap<String, Integer>(); try { //读取指定文件DATA.txt,这里使用的是相对路径 // FileInputStream fis = new FileInputStream("J:\\计算机科学与技术\\02 第二学期\\2 软件工程(代祖华)\\实验二 词频统计\\DATA.txt"); FileInputStream fis = new FileInputStream("src\\DATA.txt"); //建立BufferedReader的缓冲流,一次性读取不少数据,而后按要求分次交给上层调用者 BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String str = ""; try { //一行一行读取 while ((str = br.readLine()) != null){ filecontent = filecontent + str; } } catch (IOException e) { e.printStackTrace(); } }catch (FileNotFoundException e){ e.printStackTrace(); }
//arrspilt数组用来统计单词出现的次数 String [] arrspilt = filecontent.split("[^a-zA-Z]+"); for (int i=0;i<arrspilt.length;i++){ //经过键名来获取键值 if (map.get(arrspilt[i]) == null){ //统计键值对 map.put(arrspilt[i],1); }else { int count = map.get(arrspilt[i]); map.put(arrspilt[i],++count); } }
//利用TreeMap实现Comparator接口 Comparator<Map.Entry<String, Integer>> valcom = new Comparator<Map.Entry<String,Integer>>() { //对词频统计结果进行排序 public int compare(Map.Entry<String, Integer> rst1,Map.Entry<String, Integer> rst2) { //降序排序 int sortrst=rst2.getValue()-rst1.getValue(); return sortrst; } }; List<Map.Entry<String, Integer>> ordlist = new ArrayList<Map.Entry<String,Integer>>(map.entrySet()); // 用sort函数来排序 Collections.sort(ordlist,valcom);
//将词频统计结果输出到指定文件results.txt中 try { FileWriter fw= new FileWriter("src\\results.txt"); BufferedWriter bw= new BufferedWriter(fw); for (Map.Entry<String, Integer> entry : ordlist) { bw.write(entry.getKey() + ":" + entry.getValue()); bw.newLine(); } bw.flush();//刷新 bw.close();//关闭 System.out.println("词频统计结果已输出到result.txt文件!"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
List<Map.Entry<String, Integer>> ordlist = new ArrayList<Map.Entry<String,Integer>>(map.entrySet()); // 用sort函数来排序 Collections.sort(ordlist,valcom); Scanner sc = new Scanner(System.in); System.out.println("请输入想要统计出如今文章中的单词:"); String w = sc.next(); for (Map.Entry<String, Integer> entry : ordlist) { if(entry.getKey().equals(w)){//找到文件中与键盘录入单词相同的单词 word=entry.getKey(); count2=entry.getValue(); flag=1; break; }else{ flag=0; } } if(flag==1){ System.out.println("该单词"+word+"出现的个数为:"+count2); }else{ System.out.println("对不起文章中没有出现该单词!"); }
System.out.println("注:该文件中共有"+ordlist.size()+"个不一样的单词!"); Scanner sc = new Scanner(System.in); System.out.println("请输入要查看的高频词频的个数:"); int k = sc.nextInt(); //String k=sc.next(); //System.out.println(list.size()); if(k>0&&k<=ordlist.size())//判断输入值是否超出范围 { System.out.println("----------词频最高的前"+k+"个单词及其柱状图-----------"); for (Map.Entry<String, Integer> entry : ordlist) { //System.out.println("单词 "+entry.getKey() + " 出现 " + entry.getValue()+" 次 "); System.out.printf("单词 "+"%-8s" + "出现 " +"%-3d"+" 次 |",entry.getKey(),entry.getValue()); //用符号个数来模拟柱状图 for(int i=entry.getValue();i>0;i--) { System.out.print("⬛"); } System.out.println(); //System.out.println(entry.getKey() + ":" + entry.getValue()); if(--k==0) break;//若是k==0则再也不输出后面的词频 } System.out.println("------------------------------------------------"); }else{ System.out.println("输入有误!请从新输入!"); }
模块化程序设计是指在进行程序设计时将一个大程序按照功能划分为若干小程序模块,每一个小程序模块完成一个肯定的功能,并在这些模块之间创建必要的联系,经过模块的互相协做完成整个功能的程序设计方法。模块化
在本程序中,须要实现全文单词个数及其词频统计,用户输入任意单词词频统计和任意个数高频词频统计及柱状图显示等多个功能,虽然这个程序只是一个小程序,但却也包含多个功能,若是咱们将这若干个功能放在一个文件中,就会显得很臃肿,凌乱和复杂,在调试和维护时也很麻烦,最好的方式就是一个功能一个文件,将功能分散开来,用主程序,子程序等框架把软件的主要结构和流程描述出来,并定义和调试各部分模块,再经过主函数来实现对其余功能的调用,以功能块为单位进行程序设计,这样下降录了程序复杂度,使程序设计,调试等操做简单化。
PSP2.1 | 任务内容 | 计划共完成须要的时间(min) | 实际完成须要的时间(min) |
---|---|---|---|
Planning | 计划 | 10 | 10 |
•Estimate | • 估计这个任务须要多少时间,并规划大体工做步骤 | 10 | 10 |
Development | 开发 | 255 | 295 |
••Analysis | 需求分析 (包括学习新技术) | 10 | 15 |
•Design Spec | • 生成设计文档 | 5 | 7 |
•Design Review | • 设计复审 (和同事审核设计文档) | 5 | 7 |
•Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 5 | 6 |
•Design | 具体设计 | 10 | 10 |
•Coding | 具体编码 | 200 | 220 |
•Code Review | • 代码复审 | 5 | 10 |
•Test | • 测试(自我测试,修改代码,提交修改) | 15 | 20 |
Reporting | 报告 | 13 | 15 |
••Test Report | • 测试报告 | 4 | 3 |
•Size Measurement | 计算工做量 | 4 | 4 |
•Postmortem & Process Improvement Plan | • 过后总结 ,并提出过程改进计划 | 5 | 8 |
从本次这个词频统计程序的开发过程来看,我在作这项工做时是用来很多的时间,尤为是在开发过程当中的编码设计阶段,因为很长时间没有再写代码,关于java好多知识都忘得差很少了,因此在编码时须要耗费时间来查资料,来纠错改错,但也基本完成了本次任务,看来往后要多增强代码的编写练习。