当前位置:网站首页>比较两个对象的大小关系原来可以如此花里胡哨
比较两个对象的大小关系原来可以如此花里胡哨
2022-06-26 18:01:00 【一只懐坏旭】
一,先看一下题目
给一非空的单词列表,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。
看完题目你是不是已经有了想法??????
TopK???
NO!!!
(慢慢品)
二,解题思路
1.借助Map统计各个单词的出现次数
2.把键值对组织到一个ArrayList中
3.按照题目要求进行降序排序(出现次数+字典序)
不多说!!!!下面才是重点
三,上代码(看点在这里)
先把统计结果放入一个ArrayList
public List<String> topKFrequent(String[] words,int k){
//先统计各单词出现次数
Map<String,Integer> map = new HashMap<>();
for (String s : words ) {
int count = map.getOrDefault(s,0);//获取到当前单词出现次数
map.put(s,count+1);//存入map中
}
//把刚才统计到的字符串放到ArrayList中
//KeySet相当于得到了一个Set,Set中存放的就是所有的key
ArrayList<String> arrayList = new ArrayList(map.keySet());
//按照刚才的统计次数,针对ArrayList进行排序接下来就开始表演了
1.使用集合类Collections自带的sort方法对ArrayList进行排序
注意: sort默认按元素自身大小进行升序排序(String的字典序) 此处我们要按照字符串出现次数降序排序,也就需要比较器自定制比较规则
思考:这里我们用Comparable行不行???
答案:不行 原因:因为我们是针对String进行制定比较规则,要比较就要更改String源码,你能改吗?
所以我们得重新写一个比较器,来指定String什么算大,什么算小
static class MyComparator implements Comparator<String>{
private Map<String,Integer> map;
public MyComparator(Map<String, Integer> map) {
this.map = map;
}
@Override
public int compare(String o1, String o2) {
int count1 =map.get(o1);
int count2 = map.get(o2);
if(count1 == count2){
//String自身实现了Comparable,自带字典序的比较功能
//CompareTo就是使用String默认的比较规则
return o1.compareTo(o2);
}
return count2-count1;
}
}
public List<String> topKFrequent(String[] words,int k){
//先统计各单词出现次数
Map<String,Integer> map = new HashMap<>();
for (String s : words ) {
int count = map.getOrDefault(s,0);//获取到当前单词出现次数
map.put(s,count+1);//存入map中
}
//把刚才统计到的字符串放到ArrayList中
//KeySet相当于得到了一个Set,Set中存放的就是所有的key
ArrayList<String> arrayList = new ArrayList(map.keySet());
Collections.sort(arrayList,new MyComparator(map));
return arrayList.subList(0,k);
}2.使用匿名内部类(语法糖)
什么时候用到内部匿名类??
这个类只用一次,用完就丢了
public List<String> topKFrequent(String[] words,int k){
//先统计各单词出现次数
Map<String,Integer> map = new HashMap<>();
for (String s : words ) {
int count = map.getOrDefault(s,0);//获取到当前单词出现次数
map.put(s,count+1);//存入map中
}
//把刚才统计到的字符串放到ArrayList中
//KeySet相当于得到了一个Set,Set中存放的就是所有的key
ArrayList<String> arrayList = new ArrayList(map.keySet());
Collections.sort(arrayList, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int count1 = map.get(o1);
int count2 = map.get(o2);
if(count1 == count2){
return o1.compareTo(o2);
}
return count2-count1;
}
});
return arrayList.subList(0,k);
}3.使用lambda表达式(语法糖)
lambda表达式,本质上就是一个匿名方法
public List<String> topKFrequent(String[] words,int k){
//先统计各单词出现次数
Map<String,Integer> map = new HashMap<>();
for (String s : words ) {
int count = map.getOrDefault(s,0);//获取到当前单词出现次数
map.put(s,count+1);//存入map中
}
//把刚才统计到的字符串放到ArrayList中
//KeySet相当于得到了一个Set,Set中存放的就是所有的key
ArrayList<String> arrayList = new ArrayList(map.keySet());
Collections.sort(arrayList, (o1, o2) ->{
int count1 = map.get(o1);
int count2 = map.get(o2);
if(count1 == count2){
return o1.compareTo(o2);
}
return count2-count1;
});
return arrayList.subList(0,k);
}这两颗糖是硬糖,得慢慢品
边栏推荐
- 行锁分析和死锁
- [uniapp] the uniapp mobile terminal uses uni Troubleshooting of navigateback failure
- 数字签名论述及生成与优点分析
- 国信证券怎么开户?通过链接办理股票开户安全吗
- wechat_ Solve the problem of page Jump and parameter transfer by navigator in wechat applet
- How about opening a flush account? Is it safe? How to open a stock trading account
- 10 cloud security best practices that enterprises need to know
- [npoi] C copy sheet template across workbooks to export Excel
- 深层次安全定义剖析及加密技术
- 请指教同花顺开户选选择哪家券商比较好?现在在线开户安全么?
猜你喜欢

9、智慧交通项目(2)

A little experience of next (ITER (dataloader))

接水面试题

数据加密标准DES安全性

pycharm的plt.show()如何保持不关闭

mysql Add column 失败 因为之前有数据,不是默认null 不行

无需人工先验!港大&同济&LunarAI&旷视提出基于语义分组的自监督视觉表征学习,显著提升目标检测、实例分割和语义分割任务!

Leetcode - 226. Retourner l'arbre binaire (bfs)

Which low code platform is more friendly to Xiaobai? Here comes the professional evaluation!

【代码随想录-动态规划】T583、两个字符串的删除操作
随机推荐
非对称密码体制详解
腾讯钱智明:信息流业务中的预训练方法探索与应用实践
数据加密标准(DES)概念及工作原理
How pycharm modifies multiline annotation shortcuts
决策树与随机森林
Rich professional product lines, and Jiangling Ford Lingrui · Jijing version is listed
【QNX】命令
How about opening a flush account? Is it safe? How to open a stock trading account
KDD 2022 | how to use comparative learning in cross domain recommendation?
数字签名论述及生成与优点分析
RuntimeError: CUDA error: out of memory自己的解决方法(情况比较特殊估计对大部分人不适用)
[QNX] Command
Binary search-2
小程序设置按钮分享功能
DoS及攻擊方法詳解
【NPOI】C#跨工作薄复制Sheet模板导出Excel
[dynamic planning] Jianzhi offer II 091 Paint the house
MySql 导出数据库中的全部表索引
临时关闭MySQL缓存
二分查找-2