Map和JSONObject 如何自定义key值排序排序?

HashMap是无序的,不要用HashMap,使用TreeMap默认按照升序排列,想要降序改为下面这样

        Map<String, String> map = new TreeMap<String, String>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.compareTo(o1);
            }
        });

JSONObject案例:

        //Treemap 默认按照升序排列
        Map<String, String> map = new TreeMap<String, String>();
        
        map.put("plant-2", "wnba");
        map.put("plant-3", "nba");
        map.put("plant-5", "cba");
        map.put("plant-11", "aaa");
        map.put("plant-22", "aaa");
        map.put("plant-12", "aaa");
        
        //将map中的值放入JsonObject中,添加个plantName字段再将其放入list中
        List<JSONObject> list = new ArrayList<>();
        Set<String> strings = map.keySet();
        strings.forEach(x->{
            JSONObject jsonObject = new JSONObject(true);
            jsonObject.put("list",map.get(x));
            jsonObject.put("plantName",x);
            list.add(jsonObject);
        });
       
        list.forEach(x->{
            System.out.println(x.toJSONString());
        });
         

可以看到输出是比较乱的,直接用TreeMap进行排序就不行了

{"list":"aaa","plantName":"plant-11"}
{"list":"aaa","plantName":"plant-12"}
{"list":"wnba","plantName":"plant-2"}
{"list":"aaa","plantName":"plant-22"}
{"list":"nba","plantName":"plant-3"}
{"list":"cba","plantName":"plant-5"}

原因:

点到compareTo源码(返回-1的话,第一个参数排前面)中可以看到,它是先减法,如果都一样再判断长度,plant-11中的’1’比plant-2中的’2’ASCII码小,直接返回-1,所以plant-11就被拍到前面了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HhbyC20g-1628317765543)(en-resource://database/523:1)]

修改办法自定义排序:先判断长度再进行减法

使用以下方式对list中的JSONObject进行key排序

        //修改排序规则先按照长度再按照char比较
        Collections.sort(list, new Comparator<JSONObject>() {
            @Override
            public int compare(JSONObject o1, JSONObject o2) {
                String o11 = (String)o1.get("plantName");
                String o22 = (String)o2.get("plantName");

                if (o11.length() < o22.length()){
                    return -1;
                }if (o11.length() == o22.length()){
                    return o11.compareTo(o22);
                }else return 1;
            }
        });

可以看到以下结果:

{"list":"wnba","plantName":"plant-2"}
{"list":"nba","plantName":"plant-3"}
{"list":"cba","plantName":"plant-5"}
{"list":"aaa","plantName":"plant-11"}
{"list":"aaa","plantName":"plant-12"}
{"list":"aaa","plantName":"plant-22"}

这种方式将上面的TreeMap改为HashMap都可以排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值