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

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

文章目录

  • list.sort()&&Collections.sort()
    • 背景
    • 相关代码
      • 代码一
      • 代码二
    • 原理
      • 举一反三
    • 业务场景考虑

背景

业务中经常用到List的sort()方法,但是对于其中return的-1,0,1理解不到位,导致业务出现错误;
网上对于-1,0,1的表述并不是很清楚,今天详细聊一聊。

相关代码

先分享两段代码
业务逻辑:通过student类中的属性level做比较,level数字较小的排在前面

代码一

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

代码二

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排在前面;
    其他情况,也就是等于时,位置不变。

  • 对于代码二中的语句

if (Objects.isNull(studentLevel2)) {
	return -1;
}

可以理解为当studentLevel2为空的时候,o1排在前面,即studentLevel1排在前面,这句话的意思也就是为null的排在后面。
这个逻辑确实很难理解,外国人的思维感觉很奇妙。

举一反三

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

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的拼接到后面,这里就不提供代码了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/480240.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(附源码)基于Spring Boot与Vue的宠物用品销售系统设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2024年Java精品实战案例《100套》 &#x1f345;文末获取源码联系&#x1f345; &#x1f31…

用BSP优化3D渲染

3D渲染引擎设计者面临的最大问题之一是可见性计算&#xff1a;只必须绘制可见的墙壁和物体&#xff0c;并且必须以正确的顺序绘制它们&#xff08;应该在远处的墙壁前面绘制近墙&#xff09; 。 更重要的是&#xff0c;对于游戏等应用程序来说&#xff0c;开发能够快速渲染场景…

vue的优缺点有那些 组件常用的有那些?

优点&#xff1a; 组件化开发&#xff0c;提升效率&#xff0c;方便复用&#xff0c;便于协同开发单页面路由易于结合其他的第三方库丰富的api方法轻量高效,虚拟DOMMVVM&#xff0c;数据驱动视图轻量级的框架 缺点&#xff1a; 缺少高阶教程和文档生态环境不如angular和re…

nuclei使用方法

nuclei使用方法 查看帮助 nuclei -h 列出所有模板 nuclei -tl 查找某种cms的相关漏洞模板&#xff0c;wordpress为例 nuclei -tl -tc "contains(name,wordpress)"便会列出内容里含有wordpress关键字的漏洞检测模板 使用与某cms相关的所有漏洞模板进行扫描&#…

MATLAB机器学习工具箱——傻瓜式操作

一、使用回归学习期预测北京二手房房价 软件&#xff1a;MATLAB R2023 a 数据&#xff1a; 第一步&#xff1a;导入原始数据和待预测数据 第二步 &#xff1a;打开工具箱中的回归学习器导入学习数据 1.新建会话 2.寻找导入learning data 3.自动锁定前7列为自变量&#xff…

课时72:流程控制_for循环_嵌套循环

1.1.1 嵌套循环 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 简介 这里的嵌套实践&#xff0c;与选择语句的嵌套实践基本一致&#xff0c;只不过组合的方式发生了一些变化。常见的组合样式如下&#xff1a;for嵌套for语句for …

网络安全知识核心之TCP与UDP区别

TCP 面向连接&#xff08;如打电话要先拨号建立连接&#xff09;提供可靠的服务;UDP 是无连接的&#xff0c;即发送数据之前不需要建立连接&#xff0c;;UDP 尽最大努力交付&#xff0c;即不保证可靠交付。&#xff08;由于 UDP 无需建立连接&#xff0c;因此 UDP 不会引入建立…

Python连接MariaDB数据库

2024软件测试面试刷题&#xff0c;这个小程序&#xff08;永久刷题&#xff09;&#xff0c;靠它快速找到工作了&#xff01;&#xff08;刷题APP的天花板&#xff09;【持续更新最新版】-CSDN博客 Python连接MariaDB数据库 一、安装mariadb库 pip install mariadb 二、连接…

解决 poi3.8版本在word中插入图片不展示的问题

解决 poi3.8版本在word中插入图片不展示的问题 1. 前言2. 问题描述3. 解决问题3.1 方案1——自定义XWPFDocument3.1.1 解决代码3.1.2 参考 3.2 方案2——使用开源框架xdocreport 4. 其他 1. 前言 本次使用的是poi3.8版本&#xff0c;引入的依赖如下&#xff1a; <dependency…

【爬虫】实战-爬取Boss直聘信息数据

专栏文章索引&#xff1a;爬虫 所用工具&#xff1a; 自动化工具&#xff1a;DrissionPage 目录 一、找到目标数据(2个确定)​ 1.确定目标网页 2.确定目标网址 二、编写代码​ 三、查看数据​ 五、总结 一、找到目标数据(2个确定) 1.确定目标网页 打开目标网站 网站&am…

Llama 2 模型

非常清楚&#xff01;&#xff01;&#xff01;Llama 2详解 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/649756898?utm_campaignshareopn&utm_mediumsocial&utm_psn1754103877518098432&utm_sourcewechat_session一些补充理解&#xff1a; 序列化&#xff…

Git学习笔记之标签

Git 可以给仓库历史中的某一个提交打上标签&#xff0c;以示重要。 比较有代表性的 是人们会使用这个功能来标记发布结点&#xff08; v1.0 、 v2.0 等等&#xff09;。 1、列出标签 列出已有的标签: git tag按照通配符列出标签需要 -l 或 --list 选项。如果你只想要完整的标…

真机笔记(1)第一阶段知识讲解

目录 第一阶段讲解&#xff1a; 1.1 机房 1.2 分类&#xff1a; 1.3 机房建设标准 1.3.1 安全性: 1.3.2 供电&#xff1a; 1.3.3 空气调节&#xff1a;&#xff08;恒温恒湿&#xff09; 1.3.4 电磁防护&#xff1a; 2.1 机柜 2.2 分类 2.3 机柜的高度单位 3.1 设备…

VUE3.0(一):vue3.0简介

Vue 3 入门指南 什么是vue Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界…

故障诊断模型 | 环境基于健康指标(Health indicator)的滚动轴承故障诊断

文章目录 效果一览文章概述模型描述源码设计参考资料效果一览 文章概述 故障诊断模型 | 环境基于健康指标(Health indicator)的滚动轴承故障诊断 基于健康指标的滚动轴承故障诊断方法是一种重要的机械故障诊断技术,它通过对滚动轴承运行过程中的健康指标进行监测和分析,来判…

asp.net mvc 重新引导视图路径,改变视图路径

asp.net mvc 重新引导视图路径&#xff0c;改变视图路径 使用指定的控制器上下文和母版视图名称来查找指定的视图 通过本文学习&#xff0c;你可以根据该技法&#xff0c;去实现&#xff0c;站点自定义皮肤&#xff0c;手机站和电脑站&#xff0c;其他设备站点&#xff0c;在不…

创龙教仪基于瑞芯微3568的ARM Cortex A-55教学实验箱 适用于人工智能 传感器 物联网等领域

适用课程 Cortex-A55 ARM嵌入式实验箱主要用于《ARM 系统开发》、《ARM 应用开发》《物联网通信技术》、《嵌入式系统设计》、《移动互联网技术》、《无线传感器网络》、《物联网设计方法与应用》、《人工智能》等课程。 适用专业 Cortex-A55 ARM嵌入式实验箱主要面向电子信…

python拍卖行系统的设计与实现flask-django-nodejs-php

此系统设计主要采用的是python语言来进行开发&#xff0c;采用django/flask框架技术&#xff0c;框架分为三层&#xff0c;分别是控制层Controller&#xff0c;业务处理层Service&#xff0c;持久层dao&#xff0c;能够采用多层次管理开发&#xff0c;对于各个模块设计制作有一…

OpenAI GPT商店面临质量与合规问题;黄仁勋预测:十年内AI将实时生成游戏画面

&#x1f989; AI新闻 &#x1f680; OpenAI GPT商店面临质量与合规问题 摘要&#xff1a;OpenAI旗下的GPT商店因存在大量涉嫌侵权内容、助长学术不诚实行为及违规内容等问题而引起关注。其中包括未经授权使用迪士尼、漫威角色生成内容的GPT模型&#xff0c;以及声称能绕过剽…

PointNet++论文复现(一)【PontNet网络模型代码详解 - 分类部分】

PontNet网络模型代码详解 - 分类部分 专栏持续更新中!关注博主查看后续部分! 分类模型的训练: ## e.g., pointnet2_ssg without normal features python train_classification.py --model pointnet2_cls_ssg --log_dir pointnet2_cls_ssg python test_classification.py…
最新文章