Java中List<Map<String, Object>>排序方法

本文介绍了如何使用Lombok和Hutool库对List<Map<String, Object>>中的数据,按照Map中日期键值进行排序,通过Comparator实现并提供了一个实际操作的测试案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:针对 List<Map<排序基准date, 对象>>这样的list进行排序: 放到List中的Map是固定格式的,key为日期(可以排序的key,可以是数字或其他字符串),然后需要将List按照Map的key进行排序。

pom用到了:

  		<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.4.2</version>
        </dependency>

准备一个测试对象

import lombok.Data;
 
/**
 * @author wangdy
 * @date 2021-07-15 13:20
 */
@Data
public class TestVo {
    /**
     * Title
     */
    private String title;
    /**
     * 日期字符串
     */
    private String date;
}

排序类实现Comparator接口


import java.util.Comparator;
import java.util.Map;

/**
 * @desc: List<Map> 排序
 * @date: 2021-07-15 13:29
 */
public class MapComparator implements Comparator<Map<String, Object>> {
    @Override
    public int compare(Map<String, Object> o1, Map<String, Object> o2) {
    	// 取出map的key,进行比较排序
        String b1 = o1.get("date").toString();
        String b2 = o2.get("date").toString();
        if (b2 != null) {
            // 倒序,正序倒过来即可。
            return b2.compareTo(b1);
        }
        return 0;
    }
}

最终测试类:

package com.wdy.shardingjdbc.test;

import cn.hutool.json.JSONUtil;
import com.alibaba.druid.support.json.JSONUtils;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author wangdy
 * @date 2021-07-15 13:16
 */
public class MapListSort {

    public static void main(String[] args) {

        // 准备数据
        List<TestVo> list = Lists.newArrayList();
        for (int i = 1; i <= 5; i++) {
            TestVo testVo = new TestVo();
            testVo.setTitle("这是第" + i + "个");
            testVo.setDate(LocalDate.now().minusDays(i).toString());
            list.add(testVo);
        }
        Map<String, List<TestVo>> dateListMap = list.stream().collect(Collectors.groupingBy(TestVo::getDate));

        Set<String> keySet = dateListMap.keySet();
        // List<Map<String, Object>> : List<Map<dateStr, 对象>>
        List<Map<String, Object>> outList = Lists.newArrayList();
        for (String date : keySet) {
            Map<String, Object> innerMap = Maps.newHashMap();
            innerMap.put("date", date);
            innerMap.put("testVos", dateListMap.get(date));
            outList.add(innerMap);
        }
        System.out.println("Before sort.!!!!" + JSONUtil.toJsonStr(outList));
        // 实际排序
        outList.sort(new MapComparator());
        // Collections.sort(outList, new MapComparator());
        System.out.println("After sort.!!!!" + JSONUtil.toJsonStr(outList));
    }

}

输出:

Before sort.!!!:

[
  {
    "date": "2021-07-10",
    "testVos": [
      {
        "date": "2021-07-10",
        "title": "这是第5个"
      }
    ]
  },
  {
    "date": "2021-07-12",
    "testVos": [
      {
        "date": "2021-07-12",
        "title": "这是第3个"
      }
    ]
  },
  {
    "date": "2021-07-11",
    "testVos": [
      {
        "date": "2021-07-11",
        "title": "这是第4个"
      }
    ]
  },
  {
    "date": "2021-07-14",
    "testVos": [
      {
        "date": "2021-07-14",
        "title": "这是第1个"
      }
    ]
  },
  {
    "date": "2021-07-13",
    "testVos": [
      {
        "date": "2021-07-13",
        "title": "这是第2个"
      }
    ]
  }
]

After sort.!!!:

[
  {
    "date": "2021-07-14",
    "testVos": [
      {
        "date": "2021-07-14",
        "title": "这是第1个"
      }
    ]
  },
  {
    "date": "2021-07-13",
    "testVos": [
      {
        "date": "2021-07-13",
        "title": "这是第2个"
      }
    ]
  },
  {
    "date": "2021-07-12",
    "testVos": [
      {
        "date": "2021-07-12",
        "title": "这是第3个"
      }
    ]
  },
  {
    "date": "2021-07-11",
    "testVos": [
      {
        "date": "2021-07-11",
        "title": "这是第4个"
      }
    ]
  },
  {
    "date": "2021-07-10",
    "testVos": [
      {
        "date": "2021-07-10",
        "title": "这是第5个"
      }
    ]
  }
]

END

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一掬净土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值