对Map排序涉及到Comparator的用法

Java语言利用Collections.sort对Map,List排序

  1. TreeMap排序
Map<String, String> treeMap = new TreeMap<String, String>(new Comparator<String>() {
            public int compare(String o1, String o2) {
                // 升序排序
                return o1.compareTo(o2);
            }
        });

然后我惊讶的发现
1.在Map(interface)里面有一个内部接口Entry<K,Y>
在这里插入图片描述
2.HashMap中没有传入Comparator的构造方法,但是TreeMap有
在这里插入图片描述
在这里插入图片描述
3.HashMap和TreeMap在用法上有什么区别?
HashMap与TreeMap的区别
由于是按Key排序,还是不适合我现在需要的,我需要用value排序
在这里插入图片描述

  1. 将HashMap转换成List<Map.Entry<String, Integer>>,在借助Collections排序
    451. 根据字符出现频率排序
public String frequencySort(String s) {
        int len=s.length();
        Map<Character,Integer> map = new HashMap<>();
        for(int i=0;i<len;i++){
            Character c = s.charAt(i);
            map.put(c,map.getOrDefault(c,0)+1);
        }
        List<Map.Entry<Character,Integer>> hashList = new ArrayList<Map.Entry<Character,Integer>>(map.entrySet());
        Collections.sort(hashList,(a,b)->{
            return b.getValue()-a.getValue();
        });
        StringBuilder sb = new StringBuilder();
        for(Map.Entry<Character,Integer> entry : hashList){
            Character key = entry.getKey();
            int num = entry.getValue();
            for(int i=0;i<num;i++){
                sb.append(key);
            }
        }
        return sb.toString();
    }
//一次遍历获取char到数量的映射,并且记录最大出现的次数
//二次遍历按照最大次数来构建桶排序
//遍历桶排序的结果构建答案
public String frequencySort(String s) {
        int[] cnt = new int[128];
        int maxCount=0;
        for(int i=0;i<s.length();i++){
            Character c = s.charAt(i);
            cnt[c]++;
            maxCount=Math.max(maxCount,cnt[c]);
        }
        Map<Integer,List<Integer>> map = new TreeMap<>((a,b)->{
            return b-a;
        });
        for(int i=0;i<128;i++){
            int key = cnt[i];
            if(key!=0){
                List<Integer> temp = null;
                if(map.containsKey(key)) temp = map.get(key);
                else temp = new ArrayList<>();
                temp.add(i);
                map.put(key,temp);
            }
        }
        StringBuilder sb = new StringBuilder();
        for(Map.Entry<Integer,List<Integer>> entry:map.entrySet()){
            Integer i = entry.getKey();
            List<Integer> values = entry.getValue();
            for(int value:values){
                for(int k=0;k<i;k++){
                    sb.append((char)value);
                }
            }
        }
        return sb.toString();
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值