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 ...
随机推荐
- 【C++】类大小
[来源]C++类大小详尽讲解 [来源]空类(empty class)
- STM32F429 实测基本数据类型占用空间
实测代码 1 void CalculateDataTypeSize(void) 2 { 3 printf("sizeof(char} = %u\r\n", sizeof(char) ...
- NewStarCTF 2023 公开赛道 WEEK4|CRYPTO WP
RSA Variation II 1.题目信息 提示:"Schmidt Samoa" 附件信息 from secret import flag from Crypto.Util.n ...
- [转帖]Jmeter学习笔记(六)——使用badboy录制脚本
https://www.cnblogs.com/pachongshangdexuebi/p/11506274.html 1.下载安装 可以去badboy官网下载地址:http://www.badboy ...
- [转帖]jmap执行失败了,怎么获取heapdump?
https://www.jianshu.com/p/f4bfd169b4ca 在之前的OOM问题复盘中,我们添加了jmap脚本来自动dump内存现场,方便排查OOM问题. 但当我反复模拟OOM场景 ...
- [转帖]从CPU指令集自主到信息技术产业自主
https://zhuanlan.zhihu.com/p/365210753 现代信息技术的应用都是以计算机为基础,CPU是计算机中的信息处理中枢.CPU指令集是CPU逻辑电路与操作系统和应用程序交流 ...
- [转帖]linux系统目录结构介绍
linux的目录结构 Linux系统各个目录的作用 /: 根目录.有且只有一个根目录.所有的东西都是从根目录开始.举个例子:当你在终端里输入"/home",你其实是在告诉服务器,先 ...
- Nginx拆分配置文件的办法
Nginx拆分配置文件的办法 摘要 最近公司使用Nginx进行微服务的路由处理 但是发现随着业务发展, 配置文件越来越复杂. 修改起来也很容易出现错误. 基于此. 想通过拆分配置文件的方式来提高修改效 ...
- golang: 模仿 VictoriaMetrics 中的做法,通过把局部变量放在自定义 Context 对象中来做到hot path 的 0 alloc
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 使用 benchmark 压测过程中通常会出现这样的信息: ...
- 【小测试】golang中数组边界检查的开销大约是1.87%~3.12%
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 对比C/C++, golang等类型安全的语言会在数组访问 ...