list.sort()&&Collections.sort()深入理解

list.sort()&&Collections.sort()

文章目录

背景

业务中经常用到List的sort()方法,但是对于其中return的-1,0,1理解不到位,导致业务出现错误;

网上对于-1,0,1的表述并不是很清楚,今天详细聊一聊。

相关代码

先分享两段代码

业务逻辑:通过student类中的属性level做比较,level数字较小的排在前面

代码一

java 复制代码
studentList.sort((o1, o2) -> {
			if (o1.getstudentLevel() < o2.getstudentLevel()) {
				return -1;
			} else if (o1.getstudentLevel() > o2.getstudentLevel()) {
				return 1;
			} else {
				return 0;
			}
		});

代码二

java 复制代码
Collections.sort(studentList, new Comparator<Student>() {
			@Override
			public int compare(Student o1, Student o2) {
				if (null == o1 && null == o2) {
					return 0;
				}
				if (null == o1) {
					return 1;
				}
				if (null == o2) {
					return -1;
				}
				Long studentLevel1 = o1.getStudentLevel();
				Long studentLevel2 = o2.getStudentLevel();
				if (Objects.isNull(studentLevel1) && Objects.isNull(studentLevel2)) {
					return 0;
				}
				if (Objects.isNull(studentLevel1)) {
					return 1;
				}
				if (Objects.isNull(studentLevel2)) {
					return -1;
				}
				return studentLevel1.compareTo(studentLevel2);
			}
		});

原理

  • 要解释-1,0,1的含义,首先需要看o1,o2的顺序,也就是sort方法后括号中的内容,我们暂定为参数1和参数2,如图

    代码二的参数同图中一样,看明白这张图就可以解释-1,0,1的意思了

    -1:代表参数一 排前面

    0:位置不变

    1:代表参数二 排前面

    也就是说排序的顺序和写的参数顺序有关系,代码一中就可以理解为:-1代表o1排前面,1代表o2排前面;

  • 再来解释一下if中的条件和返回值的关系

    其实if中的条件可以理解为场景,也就是在什么场景下,参数一排在前面,什么场景下参数二排在前面;

  • 综上,这段代码就可以这样理解了:

    当o1的studentLevel小于o2的studentLevel值时,o1排在前面;

    当o1的studentLevel大于o2的studentLevel值时,o2排在前面;

    其他情况,也就是等于时,位置不变。

  • 对于代码二中的语句

java 复制代码
if (Objects.isNull(studentLevel2)) {
	return -1;
}

可以理解为当studentLevel2为空的时候,o1排在前面,即studentLevel1排在前面,这句话的意思也就是为null的排在后面。

这个逻辑确实很难理解,外国人的思维感觉很奇妙。

举一反三

很难理解,再来个代码理解一下

java 复制代码
studentList.sort((o2, o1) -> {
			if (o1.getstudentLevel() < o2.getstudentLevel()) {
				return 1;
			} else if (o1.getstudentLevel() > o2.getstudentLevel()) {
				return -1;
			} else {
				return 0;
			}
		});

可以思考一下这段代码是什么意思,大家可以评论起来。

业务场景考虑

讲完原理,再说一下业务上的问题,对于业务,我最开始用的是代码一的写法,但是codeReview时就发现了问题。

  • 问题一:当list中的对象为空时,排序会出现错误
  • 问题二:当对象中的属性studentLevel为空时,排序会出现错误

所以针对这两个问题对代码进行了优化,就有了代码二的写法,这种写法相当于是重写了compare方法,将null的情况考虑进去,这样的排序就成了不为空的时候,按照level从小到大排序,为空的排在不为空的后面。

当然还有其他优化方法,比如先将不为null的筛选出来排序,再将为null的拼接到后面,这里就不提供代码了。

相关推荐
OceanBase数据库官方博客几秒前
APQO自适应参数化查询优化框架——OceanBase 校企联合研究成果
数据库·oceanbase·分布式数据库
独自破碎E几秒前
数组列表中的最大距离
java
Aloudata2 分钟前
破解监管溯源难题:从表级血缘到算子级血缘的数据治理升级
数据库·数据挖掘·数据治理·元数据·数据血缘
猿小羽3 分钟前
基于 Spring AI 与 Streamable HTTP 构建 MCP Server 实践
java·llm·spring ai·mcp·streamable http
OceanBase数据库官方博客4 分钟前
中国联通软研院基于OceanBase引领运营商数智化转型新范式
数据库·oceanbase·分布式数据库
大模型微调Online5 分钟前
深度复盘:Qwen3-4B-Instruct-2507微调实战——打造“快思考、强执行”的 ReAct IoT Agent
java·后端·struts
fie88895 分钟前
MATLAB中LASSO方法的特征矩阵优化与特征选择实现
开发语言·matlab·矩阵
qq_297574676 分钟前
MySQL迁移到瀚高数据库 常用转换函数对照表(附XML示例,直接复用)
xml·数据库·mysql
铁蛋AI编程实战7 分钟前
Agentic AI/GPT-4o替代/Spring AI 2.0/国产大模型轻量化
java·人工智能·spring
筷乐老六喝旺仔7 分钟前
使用PyQt5创建现代化的桌面应用程序
jvm·数据库·python