要求:
解决步骤:
初步思路:
package hi.huai2; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; public class FileWordsCount { List<Map.Entry<String, Integer>> list = null;//存放键值对 long time1 = 0;//程序开始运行的时间 long time2 = 0;//结束的时间 StringBuffer buffer = null;//文件里面的内容转化成缓冲区的String //加载txt文件 public void loadFile(){ String line = null; try{ // 将文件中的文字导入内存中 BufferedReader reader = new BufferedReader(new FileReader("D:\\wordtest.txt")); // 定义字符串缓存区对象 buffer = new StringBuffer(); // 将文字放入StringBuffer中 while ((line = reader.readLine()) != null) { buffer.append(line); } reader.close();// 关闭输入流 }catch(Exception e){ e.printStackTrace(); } } //利用正则表达式进行格式匹配 public void forPatternAndMathch(){ String word = "";//the key of map; int times = 0;//the values of map // 定义正则表达式匹配单词和单个汉语 Pattern expression = Pattern.compile("([\u4E00-\u9FA5]{1})|([a-zA-Z]+)"); // 将StringBuffer中的character转换成字符串 String string = buffer.toString(); Matcher matcher = expression.matcher(string);// Map<String, Integer> map = new TreeMap<String, Integer>(); while (matcher.find()) {// 开始匹配 word = matcher.group();// 一个单词-树映射的键 if (map.containsKey(word)) {// 如果包含该键,单词出现过 times = map.get(word);// 得到单词出现的次数 map.put(word, times + 1); } else { map.put(word, 1);// 否则单词第一次出现,添加到映射中 } } //放到数组列中来 list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); } // public void print(){ int last = list.size() - 1; int i = 0; for (i = last; i > last - 15; i--) { String key = list.get(i).getKey();// key Integer value = list.get(i).getValue();// values if("the".equals(key)||"a".equals(key)|| "of".equals(key)||"to".equals(key)|| "and".equals(key)||"的".equals(key)||"了".equals(key)){ continue; } System.out.println("The word \""+key + "\" appear \"" + value+"\" times"); System.out.println("..................................."); } time2 = System.currentTimeMillis(); System.out.println("***********************************"); System.out.print("For the time is : "); System.out.println(time2 - time1 + " ms"); } //main method public static void main(String[] args)throws Exception{ FileWordsCount f= new FileWordsCount(); f.time1 = System.currentTimeMillis();//set a flag of the begin time f.loadFile(); f.forPatternAndMathch(); Collections.sort(f.list, new ValuesComparator());// sort by the pattern //output information f.print(); } } //for the way of comparatation class ValuesComparator implements Comparator<Map.Entry<String, Integer>> { @Override public int compare(Map.Entry<String, Integer> left,Map.Entry<String, Integer> right) { if (left.getValue().equals(right.getValue())) { return 0; } else if ((left.getValue()) < (right.getValue())) { return -1; } else { return 1; } } }