对 List<Map<String, Object>> 类型数据的排序

有一个Map列表, 需要对这个列表, 按Map的某几个value进行排序, 并且还要分别指定正序或者倒序. 这个实现在数据库中是非常简单的, 一串 order by col1 asc, col2 desc 搞定, 但是在Java中, 就会比较啰嗦.

记录一下, 在对比两个具体值的时候, 区分类型实现的compare方法.

  1. /**
  2. * 对List&lt;Map&gt;排序, 基于多个键
  3. * @param sorts 排序字段和方向列表
  4. * @return 排序后的列表
  5. */
  6. private Comparator<Map<String, Object>> mapComparator(List<Pager.Sort> sorts) {
  7. return (o1, o2) -> {
  8. int ret = 0;
  9. for (Pager.Sort sort : sorts) {
  10. Object v1 = o1.get(sort.field);
  11. Object v2 = o2.get(sort.field);
  12. ret = singleCompare(v1, v2, sort.order == Pager.Order.ASC);
  13. if (ret != 0) {
  14. break;
  15. }
  16. }
  17. return ret;
  18. };
  19. }
  20. private int singleCompare(Object av, Object bv, boolean asc) {
  21. int ret;
  22. if (av == null && bv == null) {
  23. ret = 0;
  24. } else if (av == null) {
  25. ret = -1;
  26. } else if (bv == null) {
  27. ret = 1;
  28. } else if (av instanceof BigDecimal) {
  29. ret = ((BigDecimal)av).compareTo((BigDecimal)bv);
  30. } else if (av instanceof Number) {
  31. if (((Number)av).doubleValue() != ((Number)bv).doubleValue()) {
  32. ret = ((Number)av).doubleValue() > ((Number)bv).doubleValue()? 1 : -1;
  33. } else {
  34. ret = 0;
  35. }
  36. } else if (av instanceof Date) {
  37. ret = ((Date)av).compareTo((Date)bv);
  38. } else {
  39. ret = String.valueOf(av).compareTo(String.valueOf(bv));
  40. }
  41. if (!asc) {
  42. return -ret;
  43. }
  44. return ret;
  45. }

调用

  1. List<Map<String, Object>> sorted = list.stream()
  2. .sorted(mapComparator(pager.getSorts()))
  3. .collect(Collectors.toList());

在 singleCompare 这个方法中, 要注意大于, 等于, 小于三种情况都要明确判断, 不能漏, 否则在sorted中会出现"Comparison method violates its general contract!"错误.

对 List 类型数据的排序

使用 Collections.sort()

  1. private static void order(List<UserPO.Field> fields) {
  2. Collections.sort(fields, new Comparator<UserPO.Field>() {
  3. public int compare(UserPO.Field o1, UserPO.Field o2) {
  4. int ret = o1.getKey().compareTo(o2.getKey());
  5. if (ret != 0) {
  6. return ret;
  7. }
  8. ret = o1.getType().compareTo(o2.getType());
  9. if (ret != 0) {
  10. return ret;
  11. }
  12. // ...
  13. return o1.getName().compareTo(o2.getName());
  14. }
  15. });
  16. }

Java 根据Map的值对 List<Map<String, Object>> 进行排序的更多相关文章

  1. 通过反射将一个java对象的属性值转换为一个Map

    将一个java对象的属性值转换为一个Map: import java.beans.BeanInfo;import java.beans.Introspector;import java.beans.P ...

  2. 将Map<String, List<Map<String,Object>>>进行排序

    首先我贴上我的代码,刚开始我也不知道怎么排序还写了一些方法,最后请教群里的大神解决了 public Map<String, List<Map<String,Object>> ...

  3. List<Map<String,Object>> 中文排序

    @RequestMapping(value = "/getBaseCodess", method = RequestMethod.GET) public ModelAndView ...

  4. 对List<Map<String, Object>>集合排序

    private void mySort(List<Map<String, Object>> list) { //list为待排序的集合,按SEQ字段排序 Comparator& ...

  5. java基础之 数据类型 & 值传递 引用传递 & String & 四种引用类型

    一.Java数据类型 分为基本数据类型与引用数据类型 基本数据类型: byte:Java中最小的数据类型,在内存中占1个字节(8 bit),取值范围-128~127,默认值0 short:短整型,2个 ...

  6. 获取map中的一个value值以及遍历map获得map里所有key、value的值

    前言: 1.声明一个map: Map map = new HashMap();2.向map中放值,注意:map是key-value的形式存放的.如: map.put(”sa”,”dd”); 3.从ma ...

  7. 用字典给Model赋值并支持map键值替换

    用字典给Model赋值并支持map键值替换 这个是昨天教程的升级版本,支持键值的map替换. 源码如下: NSObject+Properties.h 与 NSObject+Properties.m / ...

  8. JAVA枚举操作(获取值,转map集合)

    JAVA枚举相对来说比.NET的枚举功能强大,感觉就像是一种简化版的类对象,可以有构造方法,可以重载,可以继承接口等等,但不能继承类,JAVA枚举在实际开发中应用相当频繁,以下几个封装方法在实际开发中 ...

  9. Java遍历Map键、值。获取Map大小的方法

    Map读取键值对,Java遍历Map的两种实现方法 第一种方法是根据map的keyset()方法来获取key的set集合,然后遍历map取得value的值 import java.util.HashM ...

  10. java的map取值

    第一种方法根据键值的名字取值 import java.util.HashMap; import java.util.Map; /**   * @param args   */  public stat ...

随机推荐

  1. Angular系列教程之管道

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  2. 08-避免Latch的产生

    1.Latch简介 Latch就是锁存器,是一种在异步电路系统中,对输入信号电平敏感的单元,用来存储信息 锁存器在数据未锁存时,输出端的信号随输入信号变化,就像信号通过一个缓冲器,一旦锁存信号有效,数 ...

  3. 电子科技大学--ARM实验Keil uvison5 安装以及S3C2440A芯片包下载

    1.简介 本教程主要服务于电子科技大学软工嵌入式新生,节省一些查找资料的时间 2.过程 请按如下顺序安装: 1,安装mdk_514.exe (主体文件) 2,安装Keil.STM32F1xx_DFP. ...

  4. JS逆向实战27——pdd的anti_content 分析与逆向

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 本文已在微信公众号发布 目 ...

  5. SQLServer命令行备份数据库

    SQLServer命令行备份数据库 背景 SQLServer on linux 想设置计划任务自动备份数据库 感觉sqlcmd应该是最简单快捷的方式了 所以进行一下处理. 安装必备软件 sudo cu ...

  6. [转帖]datax安装+配置+使用文档

    1 DataX离线同步工具DataX3.0介绍 DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlServer.Postgre.HDFS.Hiv ...

  7. [转帖]KingbaseES 服务器运行参数分类

    https://www.cnblogs.com/kingbase/p/16969149.html Kingbase 服务器运行参数分类 说明: KingbaseES 数据库中,服务器运行参数分为多种类 ...

  8. [转帖]MOUNTING AN S3 BUCKET ON WINDOWS AND LINUX

    https://blog.spikeseed.cloud/mount-s3-as-a-disk/#mounting-an-s3-bucket-on-windows-server-2016 Wouldn ...

  9. [转帖]Linux | crontab定时任务及开机自启项

    本文总结如何使用 crontab 创建定时任务及开启自启项 1. 本文基于 CentOS 7.9 系统所写. Updated: 2022 / 9 / 5 Linux | crontab定时任务及开机自 ...

  10. [转帖]Tcpdump抓包命令

    tcpdump和ethereal可以用来获取和分析网络通讯活动,他们都是使用libpcap库来捕获网络封包的. ​在混杂模式下他们可以监控网络适配器的所有通讯活动并捕获网卡所接收的所有帧. ​要想设置 ...