Java 根据Map的值对 List<Map<String, Object>> 进行排序
对 List<Map<String, Object>> 类型数据的排序
有一个Map列表, 需要对这个列表, 按Map的某几个value进行排序, 并且还要分别指定正序或者倒序. 这个实现在数据库中是非常简单的, 一串 order by col1 asc, col2 desc 搞定, 但是在Java中, 就会比较啰嗦.
记录一下, 在对比两个具体值的时候, 区分类型实现的compare方法.
/**
* 对List<Map>排序, 基于多个键
* @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>> 进行排序的更多相关文章
- 通过反射将一个java对象的属性值转换为一个Map
将一个java对象的属性值转换为一个Map: import java.beans.BeanInfo;import java.beans.Introspector;import java.beans.P ...
- 将Map<String, List<Map<String,Object>>>进行排序
首先我贴上我的代码,刚开始我也不知道怎么排序还写了一些方法,最后请教群里的大神解决了 public Map<String, List<Map<String,Object>> ...
- List<Map<String,Object>> 中文排序
@RequestMapping(value = "/getBaseCodess", method = RequestMethod.GET) public ModelAndView ...
- 对List<Map<String, Object>>集合排序
private void mySort(List<Map<String, Object>> list) { //list为待排序的集合,按SEQ字段排序 Comparator& ...
- java基础之 数据类型 & 值传递 引用传递 & String & 四种引用类型
一.Java数据类型 分为基本数据类型与引用数据类型 基本数据类型: byte:Java中最小的数据类型,在内存中占1个字节(8 bit),取值范围-128~127,默认值0 short:短整型,2个 ...
- 获取map中的一个value值以及遍历map获得map里所有key、value的值
前言: 1.声明一个map: Map map = new HashMap();2.向map中放值,注意:map是key-value的形式存放的.如: map.put(”sa”,”dd”); 3.从ma ...
- 用字典给Model赋值并支持map键值替换
用字典给Model赋值并支持map键值替换 这个是昨天教程的升级版本,支持键值的map替换. 源码如下: NSObject+Properties.h 与 NSObject+Properties.m / ...
- JAVA枚举操作(获取值,转map集合)
JAVA枚举相对来说比.NET的枚举功能强大,感觉就像是一种简化版的类对象,可以有构造方法,可以重载,可以继承接口等等,但不能继承类,JAVA枚举在实际开发中应用相当频繁,以下几个封装方法在实际开发中 ...
- Java遍历Map键、值。获取Map大小的方法
Map读取键值对,Java遍历Map的两种实现方法 第一种方法是根据map的keyset()方法来获取key的set集合,然后遍历map取得value的值 import java.util.HashM ...
- java的map取值
第一种方法根据键值的名字取值 import java.util.HashMap; import java.util.Map; /** * @param args */ public stat ...
随机推荐
- Ubuntu Linux下的PDF阅读器推荐——Okular
安装方法 在Ubuntu下直接使用sudo apt-get install okular即可,如果中间遇到依赖项的问题,可以通过运行sudo apt --fix-broken install来自动修复 ...
- Linux-文件压缩-tar-gzip
- Qt5.9 UI设计(六)——TitleBar功能实现
前言 上一章介绍了ControlTreeWidget 与ControlTabWidget联动的功能,这一章我们将实现自定义 TitleBar 的功能 操作步骤 修改按键图标最大和最小值 右键按键图标, ...
- [转帖]Unicode与utf的前世今生
https://www.cnblogs.com/naodong/p/12742987.html 历史上存在两个独立的尝试创立单一字符集的组织,即 国际标准化组织(ISO)于1984年创建的通用字符集( ...
- PG数据库存储验证
PG数据库存储验证 背景 最近学习了SQLServer数据库的varchar和nvarchar的存储 想到PG数据库其实没让选择字符集,也没有nvarchar 所以想学习一下nvarchar的使用情况 ...
- Harbor的逻辑备份与学习
Harbor的逻辑备份与学习 背景 一直想处理一下一个有网络冲突的Harbor镜像服务器 但是因为网络层自己水平一直是不是非常自信 加上Harbor容器使用的compose的玩法, 自己不敢直接处理. ...
- [转帖]shell 把以空格分隔的变量 分割后的每个字段赋值给变量
比如我有一个变量 "123 456 789",要求以空格为分隔符把这个变量分隔,并把分隔后的字段分别赋值给变量,即a=123:b=456:c=789 共有3中方法: 法一:先定义一 ...
- 【转帖】isolcpus功能与使用
isolcpus功能存在已久,笔者追溯v2.6.11(2005年)那时内核就已经存在了isolcpus功能.根据kernel-parameters.txt 上的解释,"isolcpus功能用 ...
- React中兄弟组件通信和组件跨级传递Context的使用
React兄弟组件之间的通信 Child2组件需要去更改Child1组件中的数据. 因为Child1和Child2是兄弟组件 所以数据和事件都放在最进的父级组件中去 兄弟组件通信的简单使用 impor ...
- [LeetCode刷题记录]113 路径总和 II
题目描述 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 难度 中等 题解 采用深度搜索优先,遍历每条从根节点到叶子节点的 ...