题目描述(题目链接)
- 给一非空的单词列表,返回前 k 个出现次数最多的单词。
- 返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。
代码
class Solution {
public List<String> topKFrequent(String[] words, int k) {
Map<String,Integer> map=new HashMap<>();
for(String str:words){
int value=map.getOrDefault(str,0);
map.put(str,value+1);
}
//map.keySet相当于将map中的key全部转为Set集合
//ArrayList根据传入的Set集合构造出一个顺序表
List<String> listWords=new ArrayList<>(map.keySet());
//指定排序规则,直接进行排序
Collections.sort(listWords, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
//通过map获取到字符串的出现的次数
//变量捕获,匿名内部类可以直接使用外部的变量
// 本质上相当于编译器自动给该匿名内部类创建了一个同名同类型的属性
// 并且在实例化的时候自动进行了传参
int count1=map.get(o1);
int count2=map.get(o2);
//如果出现的次数相同,按字母顺序排序
if(count1==count2){
return o1.compareTo(o2);
}
return count2-count1;
}
});
return listWords.subList(0,k);
}
}