实现Comparator的匿名内部类

有时我们只需要一次用到自定义比较规则的compare方法,所以可以直接使用匿名内部类完成相关操作。

用一道例题梳理匿名内部类的使用方法
前K个高频单词
给一非空的单词列表,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。

题目链接:https://leetcode-cn.com/problems/top-k-frequent-words/

代码即解题思路:

class Solution {
        public List<String> topKFrequent(String[] words, int k) {
            //先统计梅哥单词出现的次数
            Map<String,Integer> map = new HashMap<>();
            for(String x : words) {
                //把每个单子和其对应出现的次数放入到map中
                //如果先前x已经出现在map中了,那么就次数+1
                //如果在map中没有找到x,那么就是用默认值0 + 1
                map.put(x,map.getOrDefault(x,0) + 1);
            }
            //把map中所有的单词复制到一个ArrayList中,相当于去重操作
            //并按照降序排序
            List<String> res = new ArrayList<>(map.keySet());
            //使用Collection类中的sort方法时
            //可以直接在sort中传入一个待比较的序列
            //也可以在sort中传入两份内容
            //一份是带比较的序列,另一份是实现了Comparator接口的对象
            //该对象一般重写了Comparator的compare方法
            //下方使用匿名内部类的方式
            //即创建了一个类,这个类不知道叫什么名字,但是知道实现了Comparator接口
            //同时在这里从写了compare方法
            //并且同时在这里实例化了一个该类的对象
            Collections.sort(res,new Comparator<String>(){
                @Override
                //在这个匿名内部类中可以直接访问到上面的map变量
                //这个操作叫做变量捕获
                public int compare(String o1, String o2) {
                    //
                    int count1 = map.get(o1);
                    int count2 = map.get(o2);
                    //如果出现次数一样的话
                    //那么就按照String中的ComparaTo方法进行比较
                    //比较规则是按照字母顺序排序
                    if(count1 == count2) {
                        return o1.compareTo(o2);
                    }
                    //让次数多的排在前面
                    return count2 - count1;
                }
            });
            //根据k截取前k个元素
            return res.subList(0,k);
        }
    }
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值