软件工程作业-----第二次
一.需求分析
1.统计一篇英文文章或者段落里出现的单词数量(词汇量)
2.统计每个单词出现的次数
3.对单词出现的次数进行排序输出
4.按照单词出现的次数进行输出,列出前10个单词的词频
5.批量文本处理
6.控制台读入英文单篇作品
二.功能实现
功能1 小文件输入。 为表明程序能跑,结果真实而不是迫害老五,请他亲自键盘在控制台下输入命令。
功能2 支持命令行输入英文作品的文件名,请老五亲自录入。
功能3 支持命令行输入存储有英文作品文件的目录名,批量统计。
功能4 从控制台读入英文单篇作品,或输入一段话。
文本的输入,路径的变化,灵活的拼接字符串,是获取输入的核心。
if(args[0].contains(".")) { //功能1 String filename = args[0]; String filepath =new File("/").getAbsolutePath()+ filename; File file = new File(filepath); io(file); }else if(args[0].equals("folder")) { //功能3 File dir = new File("E:/folder"); File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组 if (files != null) { for (int i = 0; i < files.length; i++) { String fileName = files[i].getName(); if (files[i].isDirectory()) { // 判断是文件还是文件夹 files[i].getAbsolutePath(); // 获取文件绝对路径 } else if (fileName.endsWith("txt")) { // 判断文件名是否以.txt结尾 String filepath = files[i].getAbsolutePath(); File file = new File(filepath); System.out.println(fileName.substring(0,fileName.length()-4)); io(file); System.out.println("-------------------"); } else { continue; } } } }else if(!args[0].equals("folder") &&!args[0].contains(".")) { //功能2 String filename = args[0]; String filepath =new File("/").getAbsolutePath()+ filename + ".txt"; File file = new File(filepath); io(file); } }
文本读取,大小写不区分,只统计单词,剔除除字母以外的字符。
BufferedReader br = new BufferedReader(new FileReader(file));//新建缓存区读取为所需统计文件的读取 StringBuffer mp= new StringBuffer();//更新字符缓存为mp String s; //把要统计的文件装入字符串m while (( s=br.readLine())!= null) { s=s.toLowerCase();//转化成小写 mp.append(s);//设置字符缓存的搜索路径是字符串mp } Map<String,Integer> map = new HashMap<String, Integer>();//运用哈希排序的方法进行排序 StringTokenizer st = new StringTokenizer(mp.toString(),", ?.!:\"\"''\n");//分割字符串 while (st.hasMoreTokens()) { String letter = st.nextToken(); int count; if (map.get(letter) == null) { count = 1;//表明了没有进行分割。 } else { count = map.get(letter).intValue() + 1; } map.put(letter,count); }
对单词进行排序以及输出,使用TreeSet进行排序。
Set<WordEntity> set = new TreeSet<WordEntity>(); for (String key : map.keySet()) { set.add(new WordEntity(key,map.get(key))); } System.out.println("total \t"+map.size()+ "\t words"); System.out.println(); int count = 1; for (Iterator<WordEntity> it = set.iterator(); it.hasNext(); ) { WordEntity w = it.next(); { System.out.println(w.getKey() + "\t\t" + w.getCount()); if (count == 10)// 当输出10个后跳出循环 break; count++; } }
定义一个单词的实体类WordEntity,包含两个元素,键值和次数,还有一些构造方法。
class WordEntity implements Comparable<WordEntity> { private String key; private Integer count; public WordEntity (String key, Integer count) { this.key = key; this.count = count; } public int compareTo(WordEntity o) { int cmp = count.intValue() - o.count.intValue(); return (cmp == 0 ? key.compareTo(o.key) : -cmp); } public String toString() { return key + " 出现的次数为:" + count; } public String getKey() { return key; } public Integer getCount() { return count; } }
三.PSP阶段表格