1. 题目要求
Given a non-empty list of words, return the k most frequent elements.
Your answer should be sorted by frequency from highest to lowest. If two words have the same frequency, then the word with the lower alphabetical order comes first.
2. Code
先统计词频
初始化一个priorityqueue的对象,初始化的时候重写对比Comparator<? super Entry<String, Integer>> comparator ,我们用Map.entry作为接口往队列里加,如果数值相同,就对比A, B的key的字符,要做到如果A比B首字母小,就丢前面。如果不同,就比value大小
写完队列后,将hash中的key一个一个放进去,如果pq的size大于我们要求的K,就弹出最小的
排列完成
将队列中的东西按照倒叙放进linkedlist中
List<String> res = new LinkedList<>(); Map<String, Integer> freq = new HashMap<>(); for(int i = 0 ; i < words.length; i++) { freq.put(words[i], freq.getOrDefault(words[i], 0)+1); } PriorityQueue<Map.Entry<String, Integer>> pq = new PriorityQueue<>( // (a,b) -> a.getValue() == b.getValue() ? b.getKey().compareTo(a.getKey()) : a.getValue() - b.getValue() (a,b) -> a.getValue()==b.getValue() ? b.getKey().compareTo(a.getKey()) : a.getValue()-b.getValue() ); for(Map.Entry<String, Integer> entry : freq.entrySet()) { pq.offer(entry); if(pq.size() > k) pq.poll(); } while(!pq.isEmpty()) { res.add(0, pq.poll().getKey()); } return res;