Map的值比较排序

hashmap的值为对象进行排序

背景

前端需要展示echarts图,本人需要修改一下返回数据格式。数据库查出来的为对象集合,类似这样

{
“sysName”: “”,
“equipType”: “”,
“num”: “”
}

首先需要将集合中name重复而其他不重复的数据归为一类。
fromVoList为对象集合

  HashMap<String, List<EquipmentSysFromSuperVo>> hashMap = new HashMap<>();
    List<EquipmentSysFromSuperVo> superVos = new ArrayList<>();
    fromVoList.forEach(vo->{
        EquipmentSysFromSuperVo superVo = new EquipmentSysFromSuperVo();
        superVo.setEquipType(vo.getEquipType());
        superVo.setNum(vo.getNum());
        superVos.add(superVo);
        putValue(vo.getSysName(),superVo,hashMap);
    });


    /**
     *     key相同,继续插入不同value
     */
    public static void putValue(String key, EquipmentSysFromSuperVo str, HashMap<String, List<EquipmentSysFromSuperVo>> map){
        List<EquipmentSysFromSuperVo> list = map.get(key);
        if(list == null) {
            list = new ArrayList();
        }

        for (EquipmentSysFromSuperVo equipmentSysFromSuperVo : list) {
            if (equipmentSysFromSuperVo.equals(str)) {
                return;
            }
        }

        list.add(str);
        map.put(key, list);
    }

到这里我们的hashmap就变成我们想要的形状,可以进行排序了。

实操

首先,我们知道是没法直接对一个map进行排序的。这里可以想想有没其他的简便的方法。在集合工具类Collections中的sort可对集合进行排序,还可传入一个比较器按比较器进行排序。方法如下:

@SuppressWarnings({"unchecked", "rawtypes"})
public static <T> void sort(List<T> list, Comparator<? super T> c) {
    list.sort(c);
}

这样是不是一个list的话,像上面一样传一个Comparator,用Collections.sort()方法就能解决,但这是map,那能不能转为list呢?:

        //todo 排序
        ArrayList<Map.Entry<String, List<EquipmentSysFromSuperVo>>> entries = new ArrayList<>(hashMap.entrySet());
        Collections.sort(entries, new Comparator<Map.Entry<String, List<EquipmentSysFromSuperVo>>>() {
            @Override
            public int compare(Map.Entry<String, List<EquipmentSysFromSuperVo>> o1, Map.Entry<String, List<EquipmentSysFromSuperVo>> o2) {
                Optional<String> count1 = o1.getValue().stream().map(EquipmentSysFromSuperVo::getNum).reduce((a, b) -> String.valueOf(Integer.parseInt(a) + Integer.parseInt(b)));
                Optional<String> count2 = o2.getValue().stream().map(EquipmentSysFromSuperVo::getNum).reduce((a, b) -> String.valueOf(Integer.parseInt(a) + Integer.parseInt(b)));
                return Integer.parseInt(count1.get()) - Integer.parseInt(count2.get());
            }
        });

//		不使用lambda友好点,可进内部类调试
//        Collections.sort(entries, (o1, o2) -> {
//            Optional<String> count1 = o1.getValue().stream().map(EquipmentSysFromSuperVo::getNum).reduce((a, b) -> String.valueOf(Integer.parseInt(a) + Integer.parseInt(b)));
//            Optional<String> count2 = o2.getValue().stream().map(EquipmentSysFromSuperVo::getNum).reduce((a, b) -> String.valueOf(Integer.parseInt(a) + Integer.parseInt(b)));
//            return Integer.parseInt(count1.get()) - Integer.parseInt(count2.get());
//        });

最后return那count2-count1就是进行倒排序,反过来就是正排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值