Java 自然排序和比较器排序区别?Comparable接口和Comparator比较器区别?
注:如果你对排序不理解,请您耐心看完,你一定会明白的。文章通俗易懂。建议用idea运行一下案例。
1)自然排序和比较器排序的区别?
- 自然排序是对象本身定义的排序规则,由对象实现 Comparable 接口,重写compareTo()方法。
- 比较器排序是由外部提供的排序规则,可以使用不同的比较器来定义多种排序方式。通过实现 Comparator 接口,重写compare()方法。
(2)Comparable接口简介
若一个实现了Comparable接口,则意味着该类支持排序。例如现在有一个学生类,该类实现了该接口,那么如果我们定义了一个LIst集合存储了5个该类的对象。
- 我们就可以使用Collections提供的sort方法对list集合里面的学生对象,按照体重进行排序。如果没有实现该接口,就调用sort方法就会抛出异常,因为jdk不知道如何去比较,按照什么去比较。
- 当然我们也可以使用对象数组去存储,使用Arrays.sort进行排序(原理同上)
PS:如果实现了该接口,在compare To方法则会指明如何去比较 Arrays.sort /Collections. sort通过返回值,来进行重整顺序。
- 该接口返回值为负数:表示第一个对象应该排在第二个对象之前。
- 该接口返回值为零:表示两个对象的顺序相同。
- 该接口返回值为正数:表示第一个对象应该排在第二个对象之后。
public class Student implements Comparable<Student>{private Double weight;public Student(Double weight){this.weight = weight;}//指定排序的方式-按照体重进行排序 @Override public int compareTo(Student student) {if (this.weight > student.weight) {return 1; } else if (this.weight < student.weight) {return -1;} else {return 0;}}@Overridepublic String toString() {return "Student{" +"weight=" + weight +'}';}
}public class demo {public static void main(String[] args) {Student[] stu = new Student[]{new Student(120.5), new Student(125.5), new Student(121.5)};System.out.println(Arrays.toString(stu));Arrays.sort(stu);System.out.println(Arrays.toString(stu));}
}
运行结果:
PS1:上述CompareTo代码可以进一步简化,使用double提供的compareTO方法,来判断大小,返回对应的正数 负数 零
PS2: Java中很多对象都实现了Comparable接口,可以直接进行自然排序 ,默认都是从小到大排列。
1)String:按照字符串中字符的Unicode值进行比较
2)Character:按照字符的Unicode值来进行比较
3)数值类型对应的包装类以及BigInteger、BigDecimal:按照它们对应的数值大小进行比较
4)Boolean:true 对应的包装类实例大于 false 对应的包装类实例
5)Date、Time等:后面的日期时间比前面的日期时间大
(3)Comparator比较器
它比较适用于那些没有实现comparable接口,且不方便修改代码的类。或者实现了该接口,但排序规则不适合当前操作,可以考虑使用比较器进行排序。
- 重写compare方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2。
- 我们将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。
- 可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。
案例2:
public class Dog {private int food;public Dog(int food){this.food = food;}@Overridepublic String toString() {return "Dog{" +"food=" + food +'}';}public void setFood(int food){this.food = food;}public int getFood(){return this.food;}
}public class DogComparator implements Comparator<Dog> {@Overridepublic int compare(Dog t1, Dog t2) {if (t1.getFood()>t2.getFood()){return 1;} else if (t1.getFood()<t2.getFood()){return -1;} else{return 0;}}
}public class Test {public static void main(String[] args) {Dog[] dogs = new Dog[]{new Dog(1), new Dog(4), new Dog(3), new Dog(8)};System.out.println(Arrays.toString(dogs));System.out.println("=====================");Arrays.sort(dogs, new DogComparator());System.out.println(Arrays.toString(dogs));}
}
运行结果:
总结:
Comparaable是一个排序接口实现的是自然排序,如果一个类实现了该接口,证明该类能够排序,否则不能排序,强行排序会抛异常。除了上述自然排序外,还可以实现比较器排序,通过创建比较器来说明这个类如何进行排序。二者可以一起用,举一个例子,一个类实现了自然排序,它是逆序输出,这是我突然就有一个例子想正序输出,则就可以写一个比较器。
相关文章:

Java 自然排序和比较器排序区别?Comparable接口和Comparator比较器区别?
注:如果你对排序不理解,请您耐心看完,你一定会明白的。文章通俗易懂。建议用idea运行一下案例。 1)自然排序和比较器排序的区别? 自然排序是对象本身定义的排序规则,由对象实现 Comparable 接口ÿ…...
【CV】opencv调用DIS/LK等计算光流,前一帧和当前帧写反了有什么影响?
当在计算光流时,将前一帧和当前帧输入反了,会导致一系列问题。 在计算光流时,通常是将前一帧作为模板,根据当前帧计算光流。因为光流是描述相邻帧之间像素移动的一种方法,它通过比较两帧之间的像素强度或特征点的移动…...
C语言学习细节|C语言面向对象编程!函数指针如何正确使用
文章目录 1.函数指针定义2.格式3.应用回调函数动态函数调用函数的间接调用 4.结构体与函数指针结合 1.函数指针定义 函数指针就是一个指向函数的指针变量,与指向数据的指针不同,函数指针保存的是函数的地址,这使得程序可以动态地调用不同的函…...

C语言简要(一)
总得让她开心吧 helloworld #include <stdio.h>int main() {printf("hello world!\n");return 0; } 程序框架 #include <stdio.h> int main {return 0; }输出 printf("hello world!\n"); "里面的内容叫做“字符串”,prin…...

那些年我与c++的叫板(一)--string类自实现
引子:我们学习了c中的string类,那我们能不能像以前数据结构一样自己实现string类呢?以下是cplusplus下的string类,我们参考参考! 废话不多说,直接代码实现:(注意函数之间的复用&…...
二刷算法训练营Day08 | 字符串(1/2)
今日任务: 344.反转字符串 541. 反转字符串II卡码网:54.替换数字 151.翻转字符串里的单词卡码网:55.右旋转字符串 详细布置: 1. 344. 反转字符串 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 …...

使用高防IP是应对网络安全的重要措施
使用高防IP(High Defense IP)在现代网络环境中显得尤为重要,这主要源于以下几个方面的原因: 一、网络安全形势严峻 随着互联网的快速发展,网络安全问题日益突出。各种网络攻击手段层出不穷,如分布式拒绝服…...
代码随想录-算法训练营day40【动态规划03:整数拆分、不同的二叉搜索树】
代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第九章 动态规划part03● 343.整数拆分 ● 096.不同的二叉搜索树 详细布置 今天两题都挺有难度,建议大家思考一下没思路,直接看题解,第一次做,硬想很难想出来。343. 整数…...

MySQL数据库中基本数据管理操作
使用SQL语句实现基本数据管理操作——即DML语句 1.添加数据 insert into 表名(字段名称,字段名称,字段名称)values(数据,数据,数据) 在MySQL数据库中,除了数字&#x…...

记录一下Hql遇到的零碎问题
建表相关 -- 地区维度表 drop table dim_province_full; create table dim_province_full( id string comment 编号, name string comment 省份名称, region_id string comment 大区id, area_code string comment 行政区位码, iso_code string comment 国际编码, iso_3166_2 s…...
Flutter 中的 TextField 小部件:全面指南
Flutter 中的 TextField 小部件:全面指南 在 Flutter 中,TextField 是一个允许用户输入文本的小部件。它非常灵活,支持多种文本输入场景,如单行文本、多行文本、密码输入、数值输入等。TextField 还提供了丰富的定制选项…...

GPT-4o:全面深入了解 OpenAI 的 GPT-4o
GPT-4o:全面深入了解 OpenAI 的 GPT-4o 关于 GPT-4o 的所有信息ChatGPT 增强的用户体验改进的多语言和音频功能GPT-4o 优于 Whisper-v3M3Exam 基准测试中的表现 GPT-4o 的起源追踪语言模型的演变GPT 谱系:人工智能语言的开拓者多模式飞跃:超越…...

2024中国应急(消防)品牌巡展西安站成功召开!惊喜不断
消防品牌巡展西安站 5月10日,由中国安全产业协会指导,中国安全产业协会应急创新分会、应急救援产业网联合主办,陕西消防协会协办的“一切为了安全”2024年中国应急(消防)品牌巡展-西安站成功举办。该巡展旨在展示中国应急(消防&am…...

信创电脑|暴雨新增兆芯KX-7000处理器版本
IT世界 5 月 15 日消息,暴雨公司信创家族新上架了一款搭载兆芯KX-7000系列处理器、摩尔线程8GB 显卡、16G DDR5 内存以及 512G SSD 的新配置台式电脑主机。 兆芯 KX-7000 处理器采用开先的 8 核 Chiplet互联架构,最高频率3.7 GHz,拥有 32MB 的…...
面向对象 07:抽象类相关知识,抽象类的基本概念,使用方式,以及一些注意事项
一、前言 记录时间 [2024-05-15] 系列文章简摘: 面向对象 03:类与对象的创建、初始化和使用,通过 new 关键字调用构造方法,以及创建对象过程的内存分析 面向对象 04:三大特性之——封装,封装的含义和作用&a…...
Rust中的链式调用方法
在Rust编程语言中,链式调用是一种流行的编程模式,它允许开发者以流畅、连续的方式调用多个方法。这种风格不仅提高了代码的可读性,而且使得复杂的操作可以串联在一起,形成一个清晰、简洁的语句。在Rust中,链式调用主要…...

xCode升级后: Library ‘iconv2.4.0’ not found
报错信息: targets 选中 xxxNotification: Build Phases ——> Link Binary With Libraries 中,移除 libiconv.2.4.0.tbd libiconv.2.4.0.dylib 这两个库(只有一个的移除一个就好)。 然后重新添加 libiconv.tbd 修改完…...
SQL语言:完整性约束
完整性约束 数据完整性是指存储在数据库中的数据要能正确反映实际情况,规定输入的数据不能是无效值、错误值 或者乱码等。 一、非空约束: 非空约束关键字: not null 1、非空约束的创建 create table teacher( t_id int not null, -- 为教…...
UBUNTU下CMAKE指定执行文件运行时查找库的路径
在Ubuntu下,使用CMake时,如果需要指定执行文件运行时库的搜索路径,可以在CMakeLists.txt文件中通过set_target_properties命令来设置。 以下是一个示例,假设你的目标是一个名为my_application的可执行文件,你想要添加…...

WHAT - CSS Animationtion 动画系列(四)- 移动端全屏动画
目录 一、背景1.1 GIF & Video1.2 存在的问题 二、技术方案2.1 使用CSS动画和JavaScript2.2 使用JavaScript库2.3 使用序列帧1. css animation 帧动画2. JavaScript requestAnimationFrame 帧动画 2.4 使用Canvas1. html 和 canvas 中的 video2. 基于Canvas的动画库 今天我…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...

云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...

对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...

高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...