【Java】比较器 Comparator Comparable

article/2025/9/29 4:08:41

一、背景

我们在使用 Collections.sort() 对链表进行排序(或者使用 Arrays.sort() 对数组进行排序)时,常常需要根据不同情况自定义排序规则。比如:当我们存储学生对象时,我们需要按照学生年龄进行排序,这时我们就可以通过比较器 Comparator 或者 Comparable 对排序顺序进行控制。

本文将结合示例对 Comparator 和 Comparable 两种比较器的使用进行介绍 ——

二、Comparable

Comparable 是一个接口,其本质上是一个内比较器(在类内部)。需要定义排序/比较规则的类实现 Comparable 接口,并且重写 compareTo(Object o) 方法,从而自定义比较规则。

public interface Comparable<T>

Comparable 代码示例 :

下面的代码为 Student 类重写了 compareTo 方法,实现了 Student 对象按照 age 大小进行比较

public class Student implements Comparable<Object> {String name;int age;public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "{" + this.getName() + "," + this.getAge() + "}";}// 通过重写 compareTo 方法,实现比较器@Overridepublic int compareTo(Object o) {Student student = (Student) o;return this.age - student.getAge();}public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("wanqing", 21));list.add(new Student("xinyu", 23));list.add(new Student("huahua", 1));Collections.sort(list);System.out.println(list);}
}

可以观察到输出结果按照 age 升序进行了排序 ——

在这里插入图片描述

三、Comparator

Comparator 是一个外比较器,其使用场景为 ——
当一个类未实现 Comparable 方法,或者实现的 Comparable 方法的比较规则不是我们现在想用的(比如我们想按照降序的方式排序),我们就可以通过为 sort() 方法传入 Comparator 的形式,自定义排序规则。

其使用方式如下:

Collections.sort(List<T> list, Comparator<? super T> c);
Arrays.sort(T[] a, Comparator<? super T> c);

Comparator 重写 compare 方法,方法内部重写比较规则

Comparator 代码示例

下面代码通过传入 Comparator比较器 的方式,实现了对 list 按照学生年龄降序排序

    public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("wanqing", 21));list.add(new Student("xinyu", 23));list.add(new Student("huahua", 1));// 实现对 list 按照学生年龄降序排序Collections.sort(list, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {// 降序排序return o2.getAge() - o1.getAge();}});System.out.println(list);}

可以观察到输出结果按照 age 进行了降序排序 ——

在这里插入图片描述


http://chatgpt.dhexx.cn/article/RRPnfp3H.shtml

相关文章

Java 解惑:Comparable 和 Comparator 的区别

读完本文你将了解到&#xff1a; Comparable 自然排序Comparator 定制排序总结 Java 中为我们提供了两种比较机制&#xff1a;Comparable 和 Comparator&#xff0c;他们之间有什么区别呢&#xff1f;今天来了解一下。 Comparable 自然排序 Comparable 在 java.lang 包下&am…

【Java】Comparable和Comparator接口

活动地址&#xff1a;CSDN21天学习挑战赛 ✨博客主页: XIN-XIANG荣 ✨系列专栏:【Java SE】 ✨一句短话: 难在坚持,贵在坚持,成在坚持! 文章目录 一. Comparable接口1. Comparable简介2. 为什么要实现Comparable接口3. Comparable的实际应用 Comparator接口1. Comparator简介2.…

一篇告诉你Comparator.comparing的使用

Comparator.comparing用处 很多情况下sql不好解决的多表查询,临时表分组,排序,尽量用java8新特性stream进行处理,使用java8新特性 //返回 对象集合以类属性一升序排序 list.stream().sorted(Comparator.comparing(类::属性一));//返回 对象集合以类属性一降序排序 注意两种写法…

详解Comparable和Comparator

目录 Comparable接口 Comparator接口 Comparable接口 Comparable接口在源码中的声明&#xff1a; public interface Comparable<T> {public int compareTo(T o); } 可以看到&#xff0c;只要一个compareTo方法&#xff0c;也就是说&#xff0c;实现Comparable接口的类…

Java Comparator的使用

这是啥&#xff1f; Comparator是个接口&#xff0c;是一个比较器&#xff0c;常用内部类的方式实现&#xff0c;常用于实现某个类的比较规则 怎么用&#xff1f; 场景&#xff1a;假如有一个字符串集合list&#xff0c;一共有10个元素&#xff0c;乱序的。现有排序规则orde…

Comparable与Comparator浅析

欢迎支持笔者新作&#xff1a;《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》&#xff0c;同时欢迎关注笔者的微信公众号&#xff1a;朱小厮的博客。 欢迎跳转到本文的原文链接&#xff1a;https://honeypps.com/java/comparable-and-comparator-analysis/ 今天…

Comparator和Comparable的区别

一、概述 Comparable和Comparator都是两个接口&#xff0c;接口都可以用来实现集合中元素的比较、排序&#xff0c;Comparator位于包java.util下&#xff0c;而Comparable位于包java.lang下&#xff0c;Comparable接口将比较代码嵌入自身类中&#xff0c;而Comparator既可以嵌入…

Comparator使用简介

1、Lambda表达式 2、Comparator使用简介 文章目录 一、使用方式1、Stream中sorted()方法2、Stream中max()方法3、Stream中排序JSONObject方法 二、具体方法1、 compare2、 equals3、 naturalOrder4、 comparing5、 comparingInt6、 comparingLong7、 comparingDouble8、 nullsF…

Comparator详解

前面我们讲过Java提供了一个用于比较的接口Comparable,提供了一个比较的方法,所有实现该接口的类,都动态的实现了该比较方法。实际上Java中除了比较一个接口外&#xff0c;还提供了一个接口&#xff0c;该接口也是具有比较的功能&#xff0c;但该接口注重的却是比较容器&#x…

Hough变换的理解

Hough变换&#xff1a; 原理&#xff1a;将一个空间映射到另一个空间。这里是将X&#xff0c;Y空间映射到R,Φ空间。看下图&#xff1a;左图是X,Y空间的直线&#xff0c;该直线方程&#xff1a;ykx b&#xff0c;确定方程的参数k,b也可以组成一个空间&#xff0c;这个空间中的…

matlab hough变换检测平行直线,浅谈Hough变换的平行直线检测改进方案

在遥感图像中,对江河上桥梁目标的识别具有重要意义。由于桥梁的最突出特征在于桥体的平行直线,所以对平行直线的实时检测十分重要。经典的Hough变换是一种常用的检测直线的方法,Hough变换的研究及应用动态:Hough变换于1962年由Paul Hough提出,并在美国作为专利被发表。它所…

Hough变换检测直线与圆的原理

霍夫变换的基本原理 霍夫变换(Hough Transform)可以理解为图像处理中的一种特征提取技术&#xff0c;通过投票算法检测具有特定形状的物体。霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间中的一个点形成峰值&#xff0c;从而…

Hough变换圆检测定位

Hough变换基本原理 Hough变换是由Paul Hough于1962年提出的一种检测圆的算法&#xff0c;它的基本思想是将图像从原图像空间变换到参数空间&#xff0c;在参数空间中&#xff0c;使用大多数边界点都满足的某种参数形式作为图像中的曲线的描述&#xff0c;它通过设置累加器对参…

【图像处理——hough变换那些事】

#老板的每一次点赞&#xff0c;都是对小编精神上的支持&#xff0c;愿各位老板一路长虹&#xff0c;学习进步。 点赞点赞&#xff01;&#xff01;&#xff01;&#xff01; #author&#xff1a;yyt time:2023.5.5 #机器学习—图像处理 #本文为小编第一次写文章&#…

基于Hough变换的直线检测(Matlab)

点击上方“3D视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 作者丨无敌三脚猫 来源丨 古月居 1、引言 该程序实现了一些基本的图像处理算法&#xff0c;并将它们组合在一起&#xff0c;构建了一个基于霍夫变换的直线检测器。该程序能够在图像中找到直线段的起始点和结束…

Hough变换原理

霍夫变换在识别方程式已知的曲线是常用的一种方法&#xff0c;本文通过识别直线方程为向导&#xff0c;说明霍夫变换的原理。 话不多说&#xff0c;开始今天的主题&#xff0c;我们处理的对象是二值黑白图像&#xff0c;如下图&#xff1a; 上图是我自绘的五个点&#xff0c;考…

图像处理算法 之 Hough变换

Hough变换 一、标准Hough线变换(SHT)1.1 原理1.2 SHT步骤1.3 缺点 二、渐进概率Hough变换(PPHT)2.1 原理及步骤2.2 缺点 三、Hough圆变换3.1 原理及步骤3.2 缺点 四、实验代码 一、标准Hough线变换(SHT) 1.1 原理 标准Hough变换&#xff08;standard hough transform&#xf…

MATLAB中的Hough变换

下面来介绍一下关于Hough变换的原理及其如何在MATLAB中实现。 Hough变换&#xff1a;Hough变换是一种使用表决原理的参数估计技术。其原理是利用图像空间和Hough参数空间的点&#xff0d;线对偶性&#xff0c;把图像空间中的检测问题转换到参数空间。国内外对Hough变换的研究及…

智能图像分析——Hough变换

一、原理 引用 hough变换利用点、线对偶的思想&#xff0c;把提取图像空间中直线的问题转换成在参数空间/hough空间中计算点的峰值的问题。 在x − y坐标系中&#xff0c;假设有一条直线过点( x0 , y0 )&#xff0c;那么我们可以把这条直线的方程记为 ymxb&#xff08;1&#…

霍夫Hough变换

参考: https://blog.csdn.net/qq_15971883/article/details/80583364 MATLAB帮助文档 Hough变换是一种使用表决方式的参数估计技术,其原理是利用图像空间和Hough参数空间的线-点对偶性,把图像空间中的检测问题转换到参数空间中进行。 利用Hough变换检测直线 记住:直角坐标…