读取一段文档,输出每个单词出现的频率,并且把出现频率最高的十个单词输出。
首先是第一次接触博客园,感觉这是一个非常棒的交流平台,不管是菜鸟还是老手都可以在这学习到很多。
首先看到这个题目。首先我对这个题目进行了分析,此过程大概持续了1天时间,最后我确定用Java来完成。
然后就是设计阶段:本程序利用HashMap先存储读取的单词,并且记录出现频率。然后倒入到List中,通过自定义的Comparator来通过频率高低排序,显示前十个。
然后进入编码阶段:此过程持续1天。
最后需要对自己编写的程序进行测试以及修改,发现不好的地方改进。
下面是对此程序每个阶段的具体分析:
一:此段程序是文件读取
File file = new File(path); FileInputStream fis = new FileInputStream(file); InputStreamReader isr = new InputStreamReader(fis);
二:此段程序是先声明一个StringBuffer对象,通过读取的字符来组成单词,当遇到
不是字母的时候得判断单词放入到一个HashMap中
int thechar; StringBuffer word = new StringBuffer(); HashMap<String, Integer> wordList = new HashMap<String, Integer>(); while ((thechar = isr.read()) != -1) { char letter = (char) thechar; if ((letter >= 'a' && letter <= 'z') || (letter >= 'A' && letter <= 'Z')) { word.append(letter); } else if (word.length() != 0) { String theword = new String(word); if (wordList.containsKey(theword)) { wordList.put(theword, wordList.get(theword) + 1); } else { wordList.put(theword, 1); } word.delete(0, word.length()); } } isr.close();
三:将HashMap中的数据放到list中,利用Collections类提供的sort方法,根据自定义的Comparator来按照单词出现的频率从高到低显示,
此处利用Map对象的原理,将Map对象中的键值对组(Map.Entry)调出来排序
List<Map.Entry<String, Integer>> words = new ArrayList<Map.Entry<String, Integer>>( wordList.entrySet()); Collections.sort(words, new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { //按照出现频率排序由高到低 return - (o1.getValue() - o2.getValue()); //按照字母顺序排序 // return (o1.getKey()).toString().compareTo(o2.getKey()); } });
四:下面是完整程序
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; public class ReadingTest { private static String path = "a.txt"; public static void main(String[] args) throws IOException { File file = new File(path); FileInputStream fis = new FileInputStream(file); InputStreamReader isr = new InputStreamReader(fis); // BufferedReader br = new BufferedReader(isr); // String data = null; int thechar; StringBuffer word = new StringBuffer(); HashMap<String, Integer> wordList = new HashMap<String, Integer>(); while ((thechar = isr.read()) != -1) { char letter = (char) thechar; if ((letter >= 'a' && letter <= 'z') || (letter >= 'A' && letter <= 'Z')) { word.append(letter); } else if (word.length() != 0) { String theword = new String(word); if (wordList.containsKey(theword)) { wordList.put(theword, wordList.get(theword) + 1); } else { wordList.put(theword, 1); } word.delete(0, word.length()); } } isr.close(); // br.close(); System.out.println("排序前:"); for (String key : wordList.keySet()) { System.out.println(key + " : " + wordList.get(key)); } System.out.println("排序后:"); int i = 0; for (Map.Entry<String, Integer> node : words) { if(i<10){ System.out.println(node.getKey() + " : " + node.getValue()); }else{ break; } i++; } } }
完成一次实验需要对实验进行分析,设计,编码,测试等多个步骤,每一步都不可缺少,这样才能保证实验的完整性。