zoukankan      html  css  js  c++  java
  • 单词查找排序输出

    前几天软件工程老师布置了一道题,关于单词查找排序的问题,题目是找出一篇英文文章出出现频率最高的十个单词,并打印输出。初看到这个题目,觉得不难,无非是文件读入,数组,查找单词,比较排序之类的,但是由于学得比较渣,编程水平有限,所以借助大神的力量,经过多方学习和借鉴,用java实现了。因为近年来比较流行java,java有丰富的类库和函数,可以拿来直接用,所以比较方便编程。接下来介绍java代码的思路。

    需求分析:查找十个频率最高的单词,然后输出单词及其次数。首先导入文件,可以用BufferedReader,然后用正则表达式匹配单词,如果用空格和标点也行,但是有个问题,文章中的引号不好分离,所以还是用 Pattern.compile("[a-zA-Z]+")比较好,然后用map进行相同字数的统计,然后排序,但是treemap是按key比较排序的,此题应该是换成按value比较,所以要重写比较器,最后用Collections.sort(list, comparator)进行排序。

    接下来是程序代码:

    import java.io.*;//通过数据流、序列化和文件系统提供系统输入和输出
    import java.util.*;//包含 collection 框架、遗留的 collection 类、各种工具类(字符串标记生成器、随机数生成器和位数组)
    import java.util.regex.*;//负责对字符序列进行正则表达式匹配
    public class Counts {
    public static void main(String[] args) throws Exception {  //抛出异常
    
    BufferedReader reader = new BufferedReader(new FileReader(     //从文件中导入内容
                    "C:\\Users\\admin\\desktop\\ok.txt"));
            StringBuffer buffer = new StringBuffer();
            String line = null;
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }
            reader.close();
            Pattern expression = Pattern.compile("[a-zA-Z]+");// 定义正则表达式匹配单词
            String string = buffer.toString();
            Matcher matcher = expression.matcher(string);//
            Map<String, Integer> map = new TreeMap<String, Integer>();
            String word = "";
            int times = 0;
            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<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>( //按照TreeMap 的value排序而不是key排序.将Map.Entry放在集合里
                    map.entrySet());
            
            Comparator<Map.Entry<String, Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() {  //重写比较器
                public int compare(Map.Entry<String, Integer> left,
                        Map.Entry<String, Integer> right) {
                    return (left.getValue()).compareTo(right.getValue()); // 取出单词个数(value)比较
                }
            };
            System.out.println("以下是频率最高的十个词:");
            Collections.sort(list, comparator);// 排序
            
            int last = list.size() - 1;
            for (int i = last; i > last - 10; i--) {  // 打印最多十个
                String key = list.get(i).getKey();
                Integer value = list.get(i).getValue();
                System.out.println("单词:"+key +" \n"+"次数:" + value);
            }
        }
    }
  • 相关阅读:
    课堂练习——找水王续
    电梯调度设计
    团队冲刺阶段一第五次站立会议
    团队冲刺阶段一第四次站立会议
    团队冲刺阶段一第三次站立会议
    团队冲刺阶段一第二次站立会议
    团队冲刺阶段一第一次站立会议
    《你的灯亮着吗》读书笔记三
    《你的灯亮着吗》读书笔记二
    《你的灯亮着吗》读书笔记一
  • 原文地址:https://www.cnblogs.com/suhaiyan/p/3575550.html
Copyright © 2011-2022 走看看