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的动画库 今天我…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
