计算文本文件中各个词(中英文)出现的频率

要求:

   写一个程序,分析一个文本文件中各个词出现的频率,并且把频率最高的10个词打印出来。文本文件大小约几百k均可。
 

解决步骤:

   1、读取一个 txt 文本文件;
  2、统计文件里面每个词出现的次数;
  3、进行排序,打印出频率最高的10个词。
 
编程语言java
测试文本D:\\wordtest.txt         264k
性能测试工具eclipse

初步思路:

   1、将文件内容存放在 StringBuffer 里面;
  2、利用正则表达式 分割字符串,得到一个list数组,其中list中的是map的键值对;
  3、根据map的值(次数)排序

 
   代码:

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; } } }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值