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

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

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

/**
* 对List&lt;Map&gt;排序, 基于多个键
* @param sorts 排序字段和方向列表
* @return 排序后的列表
*/
private Comparator<Map<String, Object>> mapComparator(List<Pager.Sort> sorts) {
return (o1, o2) -> {
int ret = 0;
for (Pager.Sort sort : sorts) {
Object v1 = o1.get(sort.field);
Object v2 = o2.get(sort.field);
ret = singleCompare(v1, v2, sort.order == Pager.Order.ASC);
if (ret != 0) {
break;
}
}
return ret;
};
} private int singleCompare(Object av, Object bv, boolean asc) {
int ret;
if (av == null && bv == null) {
ret = 0;
} else if (av == null) {
ret = -1;
} else if (bv == null) {
ret = 1;
} else if (av instanceof BigDecimal) {
ret = ((BigDecimal)av).compareTo((BigDecimal)bv);
} else if (av instanceof Number) {
if (((Number)av).doubleValue() != ((Number)bv).doubleValue()) {
ret = ((Number)av).doubleValue() > ((Number)bv).doubleValue()? 1 : -1;
} else {
ret = 0;
}
} else if (av instanceof Date) {
ret = ((Date)av).compareTo((Date)bv);
} else {
ret = String.valueOf(av).compareTo(String.valueOf(bv));
}
if (!asc) {
return -ret;
}
return ret;
}

调用

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

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

对 List 类型数据的排序

使用 Collections.sort()

private static void order(List<UserPO.Field> fields) {
Collections.sort(fields, new Comparator<UserPO.Field>() {
public int compare(UserPO.Field o1, UserPO.Field o2) {
int ret = o1.getKey().compareTo(o2.getKey());
if (ret != 0) {
return ret;
}
ret = o1.getType().compareTo(o2.getType());
if (ret != 0) {
return ret;
}
// ... return o1.getName().compareTo(o2.getName());
}
});
}

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. [转帖]JMeter压测Redis

    https://www.cnblogs.com/yjlch1016/p/14052402.html 一.Redis Data Set插件: https://jmeter-plugins.org/wik ...

  2. [转帖]长篇图解 etcd 核心应用场景及编码实战

    https://xie.infoq.cn/article/3329de088beb60f5803855895 一.白话 etcd 与 zookeeper 二.etcd 的 4 个核心机制 三.Lead ...

  3. [转帖]学习linux必须知道的命令

    https://www.cnblogs.com/aibeier/p/15315487.html 基础不牢,地动山摇.在linux命令行下查看命令帮助man用于查看命令的帮助信息 man cp--hel ...

  4. [转帖]strace 命令详解

    目录 1.strace是什么? 2.strace能做什么? 3.strace怎么用? 4.strace问题定位案例 4.1.定位进程异常退出 4.2.定位共享内存异常 4.3. 性能分析 5.总结 1 ...

  5. [转帖] Linux命令拾遗-理解系统负载

    https://www.cnblogs.com/codelogs/p/16060498.html 简介# 这是Linux命令拾遗系列的第七篇,本篇主要介绍Linux中负载的概念与问题诊断方法. 本系列 ...

  6. Linux无头模式使用mat分析dump的方法

    摘要 mat可以很好的进行jvm的内存dump的分析. 但是大部分服务器是没有GUI界面的. 而且就算是有GUI界面也很难直接使用. 但是随着jvm堆区越来越大. WindowsPC机器已经很难进行分 ...

  7. Windows 环境下简单的自动备份以及清理数据库的操作过程

    今天能想到要简单的备份一下windows上面的数据库. 然后并且能够定期清理文件. 然后从网上找了一下 找到把饭如下 1. 备份 创建一个目录用来存放数据库备份 c:\dbbak 然后编写一个脚本, ...

  8. js赋值的两种方式

    第一种 let obj=[ { value:undefined } ] obj[0].value.value='zahngsan' obj[0].value.label='张三' 机智的小伙伴,可能已 ...

  9. 玩一玩golang汇编

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 因为只是玩一玩,所以走的路线是:用C写代码,把C编译成AT ...

  10. 从零开始配置 vim(9)——初始配置

    虽然本系列文章叫做从0开始配置vim,似乎我们从一开始就要写vimrc配置文件,但是我们并没有这么做.我们先经过几篇文章了解了下面的几个内容 如何设置vim属性,从而改变vim的特征 配置快捷键,以提 ...