[leetcode]692. Top K Frequent Words频率最高的前K个单词

这个题的排序是用的PriorityQueue实现自动排列,优先队列用的是堆排序,堆排序请看:http://www.cnblogs.com/stAr-1/p/7569706.html

自定义了优先队列的排序方法,lambda表达式该复习下了...

public List<String> topKFrequent(String[] words, int k) {
        /*
        1.建立字符串和出现频率的映射
        2.用优先队列PriorityQueue实现排序(相同频率用compareTo方法)
        4.挑选出前k个
         */
        Map<String,Integer> map = new HashMap<>();
        //这里要用lambda表达式自定义排序:
        //如果相同频率,就按字典顺序升序排列(a在前,b在后),不同频率要根据map中的频率降序排列
        PriorityQueue<String> p = new PriorityQueue<>(
                (a,b)->(map.get(a)==map.get(b))?a.compareTo(b):(map.get(b)-map.get(a))
        );
        //映射
        for (int i = 0; i < words.length; i++) {
            map.put(words[i],map.getOrDefault(words[i],0)+1);
        }
        //排序
        for (String s :
             map.keySet()) {
            p.offer(s);
        }
        //取出前k个
        List<String> res = new ArrayList<>();
        for (int i = 0; i < k; i++) {
            res.add(p.poll());
        }
        return res;
    }
原文地址:https://www.cnblogs.com/stAr-1/p/8337722.html