对 List<Map> 结构实现多字段排序

本文介绍了如何使用 Java8 的 Lambda 表达式对 List<Map> 结构进行多字段排序,具体场景是在 List 中存储 Map,Map 包含 roomNo 和 time 两个字段。排序规则为首先根据 roomNo 升序,roomNo 相同时按 time 降序。示例代码展示了具体的实现方式,并给出了运行结果。

JAVA8 可以用 Lambda 表达式对 List 进行排序,但是只适用于List 中为实体类对象,比如List<Car>,其中Car为汽车类,这类型排序网上很多,一搜就能找到,就不说明了。

但是经常遇到 List<? extends Map> 类型的结构该如何排序呢?下面进入正题。

案例

在 List 中存入 Map,其中 Map 存入两个属性:roomNo(房间号)、time(时间)。

排序规则:先按照 roomNo 进行升序排列,如果 roomNo 一致再按照 time 降序排列。

下面是代码:

public static void main(String[] args) {
         
        // 生成待用数据
        List<Map<String, Object>> list = Lists.newArrayList();
        Map map1 = new DataMap();
        Map map2 = new DataMap();
        Map map3 = new DataMap();
        Map map4 = new DataMap();
         
        map1.put("roomNo", "0102");
        map1.put("time", "2020-01-01 00:00:11");
         
        map2.put("roomNo", "0101");
        map2.put("time", "2020-01-01 00:00:12");
         
        map3.put("roomNo", "0102");
        map3.put("time", "2020-01-01 00:00:13");
         
        map4.put("roomNo", "0102");
         
        list.add(map1);
        list.add(map2);
        list.add(map3);
        list.add(map4);
         
        // 排序器
        Comparator<Map<String, Object>> comparator = new Comparator<Map<String, Object>>() {
            @Override
            public int compare(Map<String, Object> o1, Map<String, Object> o2) {
                int o1RoomNo = Integer.parseInt(o1.get("roomNo").toString());
                int o2RoomNo = Integer.parseInt(o2.get("roomNo").toString());
                 
                if (o1RoomNo > o2RoomNo) {
                    return 1;
                }else if (o1RoomNo < o2RoomNo) {
                    return -1;
                }else{
                     
                    // 若是相同房间号,则比较时间
                    if (o1.get("time") == null || o2.get("time") == null ) {
                        return 1;
                    }
                     
                    DateTime o1Time = DateTimeUtil.parse(o1.get("time").toString());
                    DateTime o2Time = DateTimeUtil.parse(o2.get("time").toString());
                     
                    if (DateTimeUtil.compare(o1Time, o2Time) > 0) {
                        return -1;
                    }else if (DateTimeUtil.compare(o1Time, o2Time) < 0) {
                        return 1;
                    }
                    return 0;
                } 
            }
        };
         
         
        System.out.println(" --------------------------- 排序前  -----------------------------------");
        System.out.println();
        for (Map map : list) {
            System.out.println(map);
        }
         
        // 排序
        list.sort(comparator);
         
        System.out.println(" --------------------------- 排序后  -----------------------------------");
        System.out.println();
        for (Map map : list) {
            System.out.println(map);
        }
    }



运行程序,打印如下:

 --------------------------- 排序前  -----------------------------------

{"roomNo":"0102","time":"2020-01-01 00:00:11"}
{"roomNo":"0101","time":"2020-01-01 00:00:12"}
{"roomNo":"0102","time":"2020-01-01 00:00:13"}
{"roomNo":"0102"}
 --------------------------- 排序后  -----------------------------------

{"roomNo":"0101","time":"2020-01-01 00:00:12"}
{"roomNo":"0102","time":"2020-01-01 00:00:13"}
{"roomNo":"0102","time":"2020-01-01 00:00:11"}
{"roomNo":"0102"}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值