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 ...
随机推荐
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.2)
一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...
- Oracle 专用模式与共享模式的学习与思考
Oracle 专用模式与共享模式的学习与思考 说明 Oracle数据库中的专用模式和共享模式是两种不同的数据库运行模式,它们在应用场景和权限管理上有所不同. 专用模式(Dedicated Mode): ...
- [转帖]Linux进程的Uninterruptible sleep(D)状态
https://cloud.tencent.com/developer/article/1581022 Linux系统进程状态 PROCESS STATE CODES Here are the dif ...
- [转帖]Lightning 实操指南
2.2.2 Lightning 实操指南 这一节将介绍如何使用 Lightning 导入数据的实操 2.2.2.1 TiDB Lightning 快速开始 注意 TiDB Lightning 运行后, ...
- [转帖]VMware-ovftool命令行部署与导出镜像
ESXI6.0之后管理为WEB,OVF导出/部署是个渣渣,如果虚拟机文件过大,一般会报网络异常中断而失败,可使用官方ovftool工具解决,快而方便,支持linux和Mac OSX,可脚本操作,批量处 ...
- Redisson/Jedis 线程数不足报错问题的思考
Redisson/Jedis 线程数不足报错问题的思考 背景 最近公司内总出现 Redis相关的错误 !-_-! 看我最近发的博客就可以看的出来. 这个错误提示其实是 两年前 清明节进行 压测时发现的 ...
- [转帖]一口气看完45个寄存器,CPU核心技术大揭秘
https://www.cnblogs.com/xuanyuan/p/13850548.html 序言 前段时间,我连续写了十来篇CPU底层系列技术故事文章,有不少读者私信我让我写一下CPU的寄存器. ...
- STM32CubeMX教程24 WDG - 独立窗口看门狗
1.准备材料 开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) 野火DAP仿真器 keil µVision5 IDE(MDK-Arm ...
- NOI2023 游记
不完全按时间顺序写.记录 NOI 的一些琐事. 从 XDFZ 坐大巴 5 个小时来到成七.第一眼看到的是一个放着 NOI 牌子的台阶,还有一个签名墙.好像在我们之前到的人不太多? 用中英双语签名(冷月 ...
- SpringBoot中Bean的条件装配
目录 概述 Profile Conditional ConditionalOn ConditionalOnProperty 概述 众所周知,SpringBoot最腻害的地方就是容器,开发人员的日常工作 ...