对于比较类Comparator方法int compare(T o1, T o2)的应用与理解

Java集合排序:Comparator核心用法与实战技巧 在Java集合操作中,排序是常见且关键的技术需求。Comparator作为外部比较器,通过实现compare方法定义元素间的排序规则,解决了类无法修改或需要多维度排序的业务场景。相比Comparable接口,Comparator提供了更灵活的排序控制,支持多条件组合、null值处理和自定义逻辑等高级特性。Java 8引入的Lambda表达式和方法引用进一步简化了Comparator的使用,结合Stream API可以实现声明式的数据排序。在电商商品排序、学生成绩排名等实际应用中,合理使用Comparator 阅读详情

一. 前言

Comparator类是一个被@FunctionalInterface标注的函数式接口, 故通常状况下只需实现其int compare(T o1, T o2)方法, 且通常以匿名内部类或lambda的形式出现, 常见的应用场景如:

  1. 集合排序:
list.sort(Comparator<? super E> c)
list.stream().sorted(Comparator<? super T> comparator)
Collections.sort(List<T> list, Comparator<? super T> c)
  1. 创建有序集合:
new TreeSet<>(Comparator<? super E> comparator)
new TreeMap<>(Comparator<? super K> comparator)

二. 如何根据 int compare(T o1, T o2) 方法的返回值进行排序?

先看jdk中对于该方法参数及返回值的注释说明:
在这里插入图片描述
如果直译的话可能不太容易理解甚至容易给人造成困惑, 故可以将其以一种更容易接受的方式进行同等表述, 即 理解方式一 :

  • 参数o1代表前面一个元素, o2代表后面一个元素.
  • 当该方法返回负数值时, 代表o1会排在o2前面, 当该方法返回正数值时, 代表o1会排在o2后面, 当返回0时, 代表o1与o2的位置不变.

或者用另一种方式理解, 即 理解方式二 :

  • 参数o1代表前面一个元素, o2代表后面一个元素.
  • 当该方法返回负数值时, 代表o1与o2的位置不做交换, 当该方法返回正数值时, 代表o1与o2的位置进行交换, 当返回0时, 代表o1与o2的位置不变.

以上两种方式的理解对于该方法的结果是同等效果的, 如果是初学者需要硬性记忆, 择其一即可.

三. 举例说明

现在带入以上第二条的理解, 重写 int compare(T o1, T o2) 方法来对以下集合排序:

List<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(2);
list.add(4);
list.add(5);
  1. 按集合元素从小到大排序:
//正序排列: 即元素数值小的在前面, 元素数值大的在后面
list.sort((o1, o2) -> {
    // 理解方式一: 前一元素小于后一元素, 则将前一元素排在后一元素前面(返回负数)
    // 理解方式二: 前一元素小于后一元素, 则前一元素与后一元素位置不交换(返回负数)
    if (o1 < o2) {
        return -1;
    }
    // 理解方式一: 前一元素大于后一元素, 则将前一元素排在后一元素后面(返回正数)
    // 理解方式二: 前一元素大于后一元素, 则前一元素与后一元素位置交换(返回正数)
    if (o1 > o2) {
        return 1;
    }
    // 理解方式一/二: 前一元素等于后一元素, 则前一元素与后一元素位置不变(返回0)
    return 0;
});
System.out.println(list); //输出: [1, 2, 3, 4, 5]
  1. 按集合元素从大到小排序:
//倒序排列: 即元素数值大的在前面, 元素数值小的在后面
list.sort((o1, o2) -> {
    if (o1 < o2) {
        // 理解方式一: 前一元素小于后一元素, 则将前一元素排在后一元素后面(返回正数)
        // 理解方式二: 前一元素小于后一元素, 则前一元素与后一元素位置交换(返回正数)
        return 1;
    }
    // 理解方式一: 前一元素大于后一元素, 则将前一元素排在后一元素前面(返回负数)
    // 理解方式二: 前一元素大于后一元素, 则前一元素与后一元素位置不交换(返回负数)
    if (o1 > o2) {
        return -1;
    }
    // 理解方式一/二: 前一元素等于后一元素, 则前一元素与后一元素位置不变(返回0)
    return 0;
});
System.out.println(list); //输出: [5, 4, 3, 2, 1]
Java 8集合排序全解析:从Comparator到Lambda实战与性能优化 集合排序是Java编程中的基础操作,其核心在于定义元素间的比较规则。在Java中,这一规则主要通过Comparator接口实现,它决定了排序的逻辑与顺序。Java 8引入函数式编程后,Comparator成为函数式接口,使得排序代码可以通过Lambda表达式和方法引用大幅简化,提升了开发效率和代码可读性。这一技术革新不仅让排序写法更优雅,其背后基于TimSort的稳定排序算法也保证了O(n log n)的性能。在实际工程中,排序广泛应用于数据处理、业务规则展示和内存计算等场景,例如对用户列表按多字段(如部门 阅读详情

相关推荐

手把手实战:RK3588上YOLOv8模型从训练到部署全流程解析

本文详细解析了在RK3588开发板上部署YOLOv8目标检测模型的全流程。从模型训练、正确导出适配的ONNX格式,到使用RKNN-Toolkit2进行模型转换与量化,最后在板卡上完成部署与性能测试。文章提供了完整的代码示例和关键避坑指南,帮助开发者高效实现嵌入式AI应用落地。

weixin_28224217的博客 404

Java自定义Comparator实现复杂排序(什么情况返回-1?返回0?返回1?)

1、Java自定义Comparator实现复杂排序? 2、Comparator接口的compare(T o1, T o2)方法中o1 和 o2对象在原集合中的顺序是什么?

健身变秃,coding变强 4679

大数据架构中的数据血缘追踪技术解析

数据血缘(Data Lineage)是指数据从源头到目标的完整流转路径,它记录了数据在整个生命周期中的变化过程。在大数据架构中,数据血缘追踪技术已经成为数据治理的核心组成部分。本文旨在全面解析数据血缘追踪的技术原理、实现方法和应用实践,帮助读者深入理解这一关键技术。本文将从基础概念入手,逐步深入到技术实现细节,最后探讨实际应用和未来趋势。数据血缘的核心概念和技术原理数据血缘的数学模型和算法实现实际项目案例和代码解析主流工具和解决方案比较未来发展方向和技术挑战。

架构师的AI之路,分享AI应用开发架构的学习与实践。 688

Comparator中compare方法的使用

Comparator中compare方法的使用 首先要明确Comparator是一个函数式接口(有@FunctionalInterface注解),说明可以使用Lambda表达式完成比较操作,并且其中T指的是你要比较的类型 在这个接口中必须要实现的方法是int compare(T o1, T o2); int compare(T o1, T o2); 这里详细解释一下比较规则,如果在一个list集合{1, 0, 0, 2}中选这种比较规则,o1是每次要进行比较的参数,o2是每次新来的参数,举个例子:

LWing_17的博客 3481

J-LINK下载程序出现No Cortex-M Device found in JTAG chain…问题,最全7种解决方法

J-Link下载程序出现No Corect 等的问题的7种方法 后来编辑JLinkSettings.ini文件,找到"Device"项,将其更改Device="Cortex-M0+"

cjmsea的博客 5613

华为ONU远程登录管理配置

华为P602E、EG8040CONU、EG8240H5、W626E等ONU、ONT默认无法配置管理IP,无法远程telnet登录管理。校园网项目中因故障诊断需要远程登录ONU可以通过OLT的远程WEB代理功能链接登录,具体配置如下:

symstandsun的博客 6109

java compareable接口_Java中Comparable和Comparator接口区别分析

本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧。Comparable 简介Comparable 是排序接口。若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List...

weixin_33344147的博客 327

STM32CubeMX | 38-使用硬件SPI驱动以太网模块(W5500)

本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件SPI外设与以W5500通信,驱动以太网模块。 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi): W5500以太网模块 这里我使用常见的以太网模块W5500: W5500官网 http://www.w5500.cn/ W5500中文手册 iEthernet W5500 Datasheet 软件准备 需要安装好Keil - MDK及芯片对应的包,以

Mculover666的博客(嵌入式) 7388

重写Collections中的int compare(T o1, T o2)对list进行排序替代冒泡排序

根据集合对象中某一个属性,对整个集合元素进行排序。

m0_49128301的博客 256

CMM软件:PC-DMIS汽车制造二次开发

PC-DMIS 是一种广泛应用于坐标测量机(CMM)的测量软件,它不仅提供了强大的测量功能,还支持用户通过二次开发来扩展其功能。二次开发可以显著提升测量效率,满足特定的测量需求,减少重复性工作,提高数据处理和分析的准确性。本节将介绍 PC-DMIS 二次开发的基本概念、开发环境的搭建以及开发中常用的工具和方法。PC-DMIS 二次开发为用户提供了强大的工具,可以显著提升测量效率、减少重复性工作并提高数据处理和分析的准确性。

kkchenjj的博客 1813

注意力机制模块:二次创新:CBAM 与 ECA 融合形成 CECA 模块,参数量减少 40%

文章摘要: 本文提出一种轻量化注意力模块CECA,通过融合CBAM和ECA的优势解决模型部署中的精度与速度矛盾。CBAM虽具备通道和空间双重注意力,但参数量大;ECA轻量但缺乏空间注意力。CECA采用ECA的一维卷积替换CBAM的通道注意力部分,保留其空间注意力模块,在保持双注意力能力的同时减少40%参数量。实验表明该方案在边缘设备部署中能维持精度并提升推理速度,特别适用于YOLO等目标检测模型的轻量化改进。文章详细拆解了架构设计、代码实现及参数量优化原理,为算法工程师和嵌入式开发者提供了实用解决方案。

ZXSXJ的博客 236

Java Comparator comparingInt() 的使用

comparingInt简介自定义排序参数优先队列,重写比较器 简介 static <T> Comparator<T> comparingInt​(ToIntFunction<? super T> keyExtractor) 接受提取的一个函数int从类型分类键T ,并返回一个Comparator ,通过该排序关键字进行比较。 如果指定的功能也可串行化,则返回的比较器是可序列化的。 (摘自API) 参数类型 T - 要比较的元素的类型 参数 keyExtracto

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 2万+

Android16 动态隐藏systemUI右侧音量条

本文介绍了如何屏蔽SystemUI系统音量条并显示自定义音量控制条的实现方法。主要通过两个步骤:1)在编译脚本中定义控制属性persist.rp.show.volume.dialog=off来隐藏系统音量条;2)修改SystemUI源码中的VolumeDialogImpl.java文件,在showH方法中根据属性值判断是否显示系统音量条。当属性值为off时直接return,从而屏蔽系统音量条的显示,实现自定义音量控制条的替代显示。该方法通过系统属性控制显示状态,具有灵活可控的特点。

tzj1058756809的博客 779

java compare 总结:(对应接口 Comparator)

,这个方法是Comparator接口的一个方法 public int compare(Object o1, Object o2) 本来的顺序就是参数的先后顺序o1、o2; 如果保持这个顺序就返回-1,交换顺序就返回1,什么都不做就返回0; 所以 升序的话 如果o1<o2,就返回-1。 重写compareTo方法,只是重新定义比较的逻辑(1是比2大呢还是比2小呢),默认是升序排...

qq_41698081的博客 553

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java Comparator接口详解与实战应用

Comparator是Java集合框架中用于定义对象排序规则的核心接口,采用策略模式实现比较逻辑与业务解耦。作为函数式接口,其compare方法遵循返回正整数、负整数或0的基本契约,支持lambda表达式和方法引用等Java 8特性。在工程实践中,Comparator广泛应用于集合排序、多条件组合排序、null值处理等场景,特别适合与Stream API结合实现高效数据处理。通过Comparator.comparing等工厂方法,开发者可以快速构建各类比较器,同时利用thenComparing实现复杂排序逻

weixin_33851429的博客 330

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

重写Java的Arrays.sort()的比较器Comparator的compare()方法,自定义排序规则

怎么理解、重写Java的Arrays.sort()的比较器Comparator的compare()方法,自定义排序规则

weixin_54707282的博客 1814

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java compare方法和compareTo方法

Java Comparator接口排序用法,详细介绍可以阅读这个链接的内容:https://www.cnblogs.com/shizhijie/p/7657049.html 对于public int compare(Object arg0, Object arg1)的理解 1 //数组排序 2 String[] str = new String[5]; 3 Ar...

weixin_30555753的博客 179

Comparable方法中的compareTo方法的返回值的正负 判断升序 还是 降序

Comparator中的compare方法 正序排列 public int compare(int o1, int o2) { return o1 - o2; } 逆序排列 public int compare(int o1, int o2) { return o2-o1;; ...

qq_43170213的博客 6236

Java排序核心:Comparable与Comparator职责边界详解

在Java集合排序中,Comparable和Comparator共同构成对象比较的底层机制。Comparable定义对象的自然顺序,强调唯一性、稳定性和数学一致性,适用于ID、时间戳等不可变标识;Comparator则提供外部、动态、多维度的场景化排序能力,支持Lambda链式组合与运行时策略切换。二者协同实现高内聚低耦合的设计目标,在Spring Data、MyBatis等主流框架中被广泛集成。掌握其差异不仅关乎代码正确性(如避免ClassCastException、TreeSet崩溃),更直接影响系统可

weixin_30897079的博客 396

Comparable 与 Comparator 的区别

为了方便实例的排序,我们常常使用到 Comparable<> 或者 Comparator<> 这两个接口,这两个看似很相似,其实是有很大区别的Comparable这个接口的位置为 java.lang.Comparable ,如果一个类实现的 这个接口,这个类的实例就具备与同一个类的其它实例的比较能力。我们需要实现 Comparable 接口中的 int compareTo(Object o1)

Amaxyan的博客 397

蓝桥杯Java排序进阶:Comparator与Comparable接口的3种实战写法与选择策略

本文深入解析蓝桥杯Java编程竞赛中的排序技巧,重点介绍Comparator与Comparable接口的3种实战写法(匿名内部类、Lambda表达式、方法引用)及其选择策略。通过对比分析不同实现方式的性能与适用场景,帮助开发者掌握高效、优雅的排序代码编写方法,提升竞赛编程效率。

weixin_38166557的博客 359

面试官问:Comparable和Comparator有什么区别?(附图解+比喻+避坑指南)

摘要:Comparable是让对象自身具备比较能力的“内比较器”(自然排序),Comparator是独立于对象之外的“外比较器”(策略模式)。Comparable在类内部实现compareTo,排序规则单一固定;Comparator在类外部实现compare,可定义多种灵活规则。本文用“身高尺 vs 裁判评分”比喻 + 源码级解析 + 5道面试官追问,彻底讲透这道Java集合必考题。一句话:Comparable是“我自带比较能力”,Comparator是“你给我定比较规则”。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 665

Java Comparator深度解析:从核心原理到Lambda实战与性能优化

在Java编程中,对象排序是集合操作和算法实现的基础需求。其核心原理在于定义明确的比较规则,确保排序算法的正确性和稳定性。Comparator接口作为Java集合框架的关键组件,通过解耦比较逻辑与业务对象,提供了灵活、可复用的排序方案,极大提升了代码的可维护性和扩展性。从传统的匿名内部类到Java 8引入的Lambda表达式与方法引用,Comparator的演进显著简化了开发,同时链式调用(thenComparing)、空值处理(nullsFirst/nullsLast)等高级特性进一步增强了其工程实践价值

weixin_34007020的博客 416

java8 排序_Java 集合排序策略接口 Comparator

1. 前言 最近用到了集合排序(基于 Java 8)。现在我能用 Stream 的就用 Stream ,真香!排序可以这么写: List<People> peoples = new ArrayList<>(); // 中间省略 // 按照年龄从小到大排序 peoples.sort(Comparator.comparing(People::getAge)); 这里排...

weixin_39975810的博客 110

Java Comparator详解:从原理到实战,掌握灵活排序与比较

在Java编程中,排序和比较是处理集合数据的基础操作,它直接关系到数据组织和检索的效率。其核心原理是通过定义对象间的顺序关系,为排序算法提供决策依据。这一机制的技术价值在于实现了排序策略的灵活性和可复用性,是策略模式的典型应用。在实际开发中,无论是数据库查询结果排序、用户界面表格的多列排序,还是优先级队列的实现,都离不开高效、可定制的比较逻辑。本文聚焦于Java Comparator接口,深入剖析其作为函数式接口的设计思想,并详细讲解如何通过Lambda表达式、方法引用以及比较链来构建清晰、健壮的排序规则,

weixin_30314813的博客 304

Java8_Lambda学习(1)——关于Comparator接口

前言(吐槽自己,正文在下):其实一开始只是简单看了看lambda,知道有,能写个hello world级别的例子而已。本着现在开始总比不看好的原则,学习一波。。 —————————————————————分割线———————————————————— 依旧菜鸟风格,Lambda详情等不作描述。 在习惯匿名类的用法后,直接看Lambda其实有点看不懂。Collections.sort(a, ne

ema1995cylove的博客 986
上一篇: CentOS安装java
下一篇: mybatis中SqlSessionFactory及SqlSession线程安全问题
deviant-ART
博客等级 码龄10年 69粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值