A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一道Java面试题  读取一片英文文章,输出其中出现单词的次数最多的5个.
求大神解决?感谢啦{:soso_e142:}

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 好牛叉的新人

查看全部评分

9 个回复

倒序浏览
这是我的思路:大家勿喷啊!
  1. package com.algorithm.interview;

  2. import java.io.BufferedReader;
  3. import java.io.FileReader;
  4. import java.util.ArrayList;
  5. import java.util.Collections;
  6. import java.util.Comparator;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.TreeMap;
  10. import java.util.regex.Matcher;
  11. import java.util.regex.Pattern;

  12. public class Counts {
  13.         public static void main(String[] args) throws Exception {

  14.                 BufferedReader reader = new BufferedReader(new FileReader(
  15.                                 "D:\\main.txt"));
  16.                 StringBuffer buffer = new StringBuffer();
  17.                 String line = null;
  18.                 while ((line = reader.readLine()) != null) {
  19.                         buffer.append(line);
  20.                 }
  21.                 reader.close();
  22.                 Pattern expression = Pattern.compile("[a-zA-Z]+");// 定义正则表达式匹配单词
  23.                 String string = buffer.toString();
  24.                 Matcher matcher = expression.matcher(string);//
  25.                 Map<String, Integer> map = new TreeMap<String, Integer>();
  26.                 String word = "";
  27.                 int times = 0;
  28.                 while (matcher.find()) {// 是否匹配单词
  29.                         word = matcher.group();// 得到一个单词-树映射的键
  30.                         if (map.containsKey(word)) {// 如果包含该键,单词出现过
  31.                                 times = map.get(word);// 得到单词出现的次数
  32.                                 map.put(word, times + 1);
  33.                         } else {
  34.                                 map.put(word, 1);// 否则单词第一次出现,添加到映射中
  35.                         }
  36.                 }
  37.                 /*
  38.                  * 核心:如何按照TreeMap 的value排序而不是key排序.将Map.Entry放在集合里, 重写比较器,在用
  39.                  * Collections.sort(list, comparator);进行 排序
  40.                  */

  41.                 List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(
  42.                                 map.entrySet());
  43.                 /*
  44.                  * 重写比较器
  45.                  * 取出单词个数(value)比较
  46.                  */
  47.                 Comparator<Map.Entry<String, Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() {
  48.                         public int compare(Map.Entry<String, Integer> left,
  49.                                         Map.Entry<String, Integer> right) {
  50.                                 return (left.getValue()).compareTo(right.getValue());
  51.                         }
  52.                 };
  53.                 Collections.sort(list, comparator);// 排序
  54.                 // 打印最多五个
  55.                 int last = list.size() - 1;
  56.                 for (int i = last; i > last - 5; i--) {
  57.                         String key = list.get(i).getKey();
  58.                         Integer value = list.get(i).getValue();
  59.                         System.out.println(key + " :" + value);
  60.                 }
  61.         }
  62. }
复制代码
回复 使用道具 举报
{:soso_e179:}      
回复 使用道具 举报

小弟学习java1年半了。java基础、java web、 spring、struts、hibernate都学过一到两遍
回复 使用道具 举报
abian 发表于 2013-8-1 23:25
小弟学习java1年半了。java基础、java web、 spring、struts、hibernate都学过一到两遍 ...

不错不错
回复 使用道具 举报

本来准备去找工作的,今年大三,感觉太早,所以去黑马混混,多认识一些哥们 哈哈哈:lol
回复 使用道具 举报
看来也是个技术大帝
回复 使用道具 举报
神之梦 发表于 2013-8-1 23:37
看来也是个技术大帝

大家考虑哈:如果文件特别大 有10个G该怎样提高效率了?
回复 使用道具 举报
大家考虑哈:如果文件特别大 有10个G,该方法使用的事正则表达式,文件大了效率就低了,该怎样提高效率了?
回复 使用道具 举报
abian 发表于 2013-8-1 23:48
大家考虑哈:如果文件特别大 有10个G该怎样提高效率了?

我想说,我是小菜鸟
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马