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>() {@Overridepublic 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.mzph.cn/news/764487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯 2022 省B 李白打酒加强版

这题用递归暴力的方法如下&#xff1a; #include<iostream> #include<bits/stdc.h> using namespace std; int num; int N,M; void dfs(int now,int n,int m) {if(now<0 || n>N ||m>M)return ;if(nN && mM){if(now1)num1;return;}dfs(now-1,n,m1…

微服务day05(下) -- ES文档操作 + RestApi + RestClient操作文档

3.1.新增文档 语法&#xff1a; POST /索引库名/_doc/文档id {"字段1": "值1","字段2": "值2","字段3": {"子属性1": "值3","子属性2": "值4"},// ... } 示例&#xff1a; # 插…

内网使用rustdesk进行远程协助

文章目录 前言一、搭建rustdesk中继服务器二、搭建文件下载服务器三、创建引导脚本四、使用 前言 内网没有互联网环境&#xff0c;没法使用互联网上有中继服务器的远程协助工具&#xff0c;如teamviewer、todesk、向日癸等&#xff1b;在内网进行远程维护可以自己搭建中继服务…

网络基础「HTTP」

&#x1f52d;个人主页&#xff1a; 北 海 &#x1f6dc;所属专栏&#xff1a; Linux学习之旅、神奇的网络世界 &#x1f4bb;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 1.再谈协议1.1.认识URL1.2.Encode 和 Decode 2.HTTP 协议2.1.协议格式2.2.见一见请求2.…

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

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

HCIP的学习(3)

网络类型及数据链路层协议 网络类型分类 P2P网络----点到点网络类型MA网络-----多点接入网络 BMA----广播型多点接入网络NBMA—非广播型多点接入网络&#xff08;快淘汰了&#xff09; 数据链路层协议 MA网络 以太网协议 特点&#xff1a;需要使用MAC地址对设备进行区分…

Java安全 反序列化(5) CC6链原理分析

Java安全 反序列化(5) CC6链原理分析 CC6学习的目的在于其可以无视jdk版本&#xff0c;这条链子更像CC1-LazyMap和URLDNS链子的缝合版 文章目录 Java安全 反序列化(5) CC6链原理分析前言一.CC6的原理和实现以及易错点我们如何实现调用LazyMap.get()方法一个易错点 二.完整CC6P…

【超全详解】Maven工程配置与常见问题解决指南

Maven工程 目录 Maven工程一、如何检查Maven工程是否配置正确&#xff1f;1、检查路径2、检查基本配置3、其他配置 二、Maven的基本操作基本操作install和package的区别 三、获取别人的Maven工程之后如何修改&#xff1f;四、如何正确写好配置文件&#xff1f;1.寻找配置资源2.…

Gitlab的流水线任务【实现每小时自动测试 dev分支的更新】

背景 在现代软件开发实践中&#xff0c;持续集成&#xff08;Continuous Integration, CI&#xff09;是确保代码质量和快速响应软件缺陷的关键策略。GitLab 提供了强大的 CI/CD 功能&#xff0c;允许开发者自动化测试和部署流程。本文将介绍如何设置 GitLab 流水线计划任务&a…

Java22重磅发布!!!!卷不动了,真的卷不动了。。。。

就在3月19日&#xff0c;Java22重磅发布。Java22新增了12项增强功能&#xff0c;其中包括七个预览特性和一个孵化器特性&#xff0c;这些功能都显著到足以引起JDK增强提案&#xff08;JEPs&#xff09;的关注。它们涵盖了Java语言、其API、性能以及JDK中包含的工具的改进。 真…

【网络基础】VRRP虚拟路由冗余协议介绍与配置

目录 一、VRRP的概述 1.1 VRRP的由来 1.2 作用 1.3 基本结构 1.4 状态机流程 1.5 设备类型 二、 实例演示 一、VRRP的概述 1.1 VRRP的由来 局域网中的用户终端通常采用配置一个默认网关的形式访问外部网络&#xff0c;如果此时默认网关设备发生故障&#xff0c;将中断…

设计模式 --4:工厂方法模式

总结 &#xff1a; 个人理解&#xff1a; 工厂方法模式就是在简单工程模式的基础下将工厂类抽象出来。如果不抽象工厂类 &#xff0c;每一次创建一个新的算法&#xff0c;都要修改原来的工厂类&#xff0c;这不符合 开放–封闭原则 将工厂类给抽象出来&#xff0c;让具体的算法…

使用zabbix自动发现规则监控oracle分区表的分区键的合法

一、 创建从数据库查询原始数据脚本 编写脚本query_table.sh vim query_table.sh #!/bin/bash temp_outfile"/tmp/table.source" outfile"/tmp/table.txt" source /home/oracle/.bash_profilesqlplus -s zabbix/zabbix>${temp_outfile}<<EOF c…

贪心算法入门

简介 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。也就是首先选取局部最优&#xff0c;从局部最优推出全局最优。 举例…

【python开发】安装配置启动+数据库管理+表管理+数据行管理+python操作Mysql及相关安全的问题

Mysql入门 一、安装&启动1、安装2、测试3、设置和修改root密码 二、数据库管理1、内置客户端操作&#xff08;1&#xff09;查看当前所有的数据库(show databases);&#xff08;2&#xff09;创建数据库&#xff1a;create database learn&#xff08;数据库名&#xff09;…

北京中科富海低温科技有限公司确认出席2024第三届中国氢能国际峰会

会议背景 随着全球对清洁能源的迫切需求&#xff0c;氢能能源转型、工业应用、交通运输等方面具有广阔前景&#xff0c;氢能也成为应对气候变化的重要解决方案。根据德勤的报告显示&#xff0c;到2050年&#xff0c;绿色氢能将有1.4万亿美元市场。氢能产业的各环节的关键技术突…

四川宏博蓬达法律咨询有限公司:法律服务安全的新标杆

在这个法治社会&#xff0c;法律服务行业扮演着越来越重要的角色。四川宏博蓬达法律咨询有限公司&#xff0c;作为行业内的佼佼者&#xff0c;始终坚持以客户为中心&#xff0c;为客户提供专业、高效、安全的法律服务。 一、公司背景与实力展示 四川宏博蓬达法律咨询有限公司自…

C语言例3-26:逗号表达式的例子

逗号表达式&#xff1a; 表达式1&#xff0c;表达式2 表达式可以是算术表达式、关系表达式、逻辑表达式、条件表达式、赋值表达式和逗号表达式。 代码如下&#xff1a; #include<stdio.h> int main(void) {int i1,j;float f2.0f;char chb; //b(98)// printf(&…

罗格朗逸景PLUS IOT智能系统发布,为您提供更智能的生活体验!

罗格朗全新推出的逸景PLUS IOT智能系统现已正式上市,采用纤薄纯平的设计,功能丰富全面,支持灯光/温度/场景控制、背景音乐等多种功能,整合罗格朗IOT2.0系统,集成可视对讲,为用户打造更舒适、安全的智能生活。 罗格朗智能家居 罗格朗是全球电气与智能建筑系统专家,创立于1865年…

【3D reconstruction 学习笔记 第二部】

三维重建 3D reconstruction 4. 三维重建与极几何三角化&#xff08;线性解法&#xff09;三角化&#xff08;非线性解法&#xff09;多视图几何极几何极几何约束基础矩阵估计 5. 双目立体视觉重建6. 多视图重建7. SFM 系统设计8. SLAM系统设计 4. 三维重建与极几何 三角化&…