java 实现Comparable接口和实现Comparator接口排序的区别

Comparable接口

  1. 作用
    • Comparable接口是在类的内部实现的,用于指定类的默认比较规则。
    • 当一个类实现了Comparable接口时,它必须实现compareTo方法,该方法用于定义对象之间的自然顺序。
  2. 实现方式
    • 实现Comparable接口的类必须重写compareTo方法,该方法返回一个整数值,表示当前对象与另一个对象的比较结果。
  3. 使用场景
    • 当你需要定义类的默认排序方式时,应该实现Comparable接口。
    • 例如,对于String类,排序时通常使用字典顺序,因此String类实现了Comparable接口。
  4. 举例:
public class Person implements Comparable<Person>{private int age;private String name;Person(int age,String name){this.age = age;this.name = name;}public int getAge() {return age;}public String getName() {return name;}@Overridepublic int compareTo(Person o) {return this.age-o.age;}@Overridepublic String toString() {return name+":"+age;}
}public static void main(String[] args) {List<Person> personList = new ArrayList<>();personList.add(new Person(15, "zhangsan"));personList.add(new Person(12, "lisi"));personList.add(new Person(17, "wangwu"));System.out.println("排序前");System.out.println(personList);System.out.println("排序后");Collections.sort(personList);System.out.println(personList);
}

运行结果
在这里插入图片描述

Comparator接口

  1. 作用
    • Comparator接口是在类的外部实现的,它允许你实现多种不同的排序规则。
    • 通过Comparator,你可以在不修改类本身的情况下,实现多种不同的排序方式。
  2. 实现方式
    • Comparator接口包含一个compare方法,用于比较两个对象的顺序。
    • 通常在创建对象实例时,可以传递一个Comparator对象,用于定义对象的排序方式。
  3. 使用场景
    • 当你需要对某个类的对象进行多种不同的排序时,应该使用Comparator接口。
    • 例如,对于一个Person类,可能需要根据年龄、姓名等字段进行不同的排序,这时就可以创建不同的Comparator实现来实现不同的排序规则。
  4. 举例:
class MyComparator implements Comparator<Person>{@Overridepublic int compare(Person o1, Person o2) {return o2.getAge()-o1.getAge();}
}public static void main(String[] args) {List<Person> personList = new ArrayList<>();personList.add(new Person(15, "zhangsan"));personList.add(new Person(12, "lisi"));personList.add(new Person(17, "wangwu"));System.out.println("排序前");System.out.println(personList);System.out.println("排序后");//下面可以简写为personList.sort(new MyComparator());Collections.sort(personList,new MyComparator());System.out.println(personList);
}

运行结果:
在这里插入图片描述

  1. 为了防止误以为是实现Comparable接口才拍的序,这里使用了降序排列

总结:要比较的类实现Comparable接口后只能通过实现的compareTo方法中特定的比较规则进行比较,如果该类有不同的比较需求则没办法满足(例如学生类在A场景下需要按照年龄进行排序,在B场景中需要按照姓名进行排序),Comparator接口不需要比较的类去实现可以根据不同的比较需求自定义不同的比较规则因此更加灵活。

两种方式都实现了,那种的优先级更高?

这取决于Collections.sort()方法是否传入了自定义Comparator排序规则,如果传入了自定义Comparator排序规则那以Comparator为准否则以Comparable为准。

集合可以用Collections.sort()来排序,那数组呢?

对于数组而言可以使用Arrays.sort()来排序,和Collections.sort一样也支持传递自定义排序规则

示例:

Person[] peopleArray = new Person[] { ... }; // 假设这里有一个Person类的数组
Arrays.sort(peopleArray); // 默认按照Person类的compareTo方法(例如按年龄)进行排序
Arrays.sort(peopleArray, new MyComparator()); // 使用自定义的比较器按姓名排序

Set集合如何排序?

Set集合的特点是,无序且元素不能重复,通常情况下是不能直接使用Collections.sort方法来排序的,因为Set接口本身并没有提供排序的保证,如果你希望对Set中的元素进行排序,一般的做法是将Set转换为List,然后再对List进行排序。这样做的好处是可以利用Collections.sort方法来对List进行排序,因为List接口支持有序的元素集合。

示例:

Set<Person> personSet = new HashSet<>(); // 假设这里有一个存放Person类对象的Set集合
personSet.add(new Person(15, "zhangsan"));
personSet.add(new Person(12, "lisi"));
personSet.add(new Person(17, "wangwu"));// 将Set转换为List
List<Person> personList = new ArrayList<>(personSet);// 使用Collections.sort对List进行排序
Collections.sort(personList, new MyComparator()); // 使用自定义的比较器按姓名排序

那是所有的Set集合都需要转为List来进行排序吗?有没有特例?

不是所有的Set集合都需要转换为List来排序。在Java中,Set接口的实现类通常有不同的排序保证和特性,具体取决于具体的实现类。下面来介绍常见的Set接口实现类及其排序特性:

  1. HashSet
    • HashSet不保证元素的顺序,因此无法直接使用Collections.sort方法进行排序。如果需要对HashSet中的元素进行排序,首先需要将其转换为List,然后再进行排序。
  2. LinkedHashSet
    • LinkedHashSet保持元素插入的顺序,即元素迭代的顺序与插入顺序一致。可以将LinkedHashSet转换为List,然后利用Collections.sort对List进行排序。
  3. TreeSet
    • TreeSet是按照元素的自然顺序或者通过提供的Comparator进行排序的。因此,如果使用TreeSet存储元素,并且在构造TreeSet时提供了Comparator,那么TreeSet中的元素会按照指定的排序规则进行排序,无需额外的步骤。

示例代码如下所示:

// 使用TreeSet并提供Comparator来存储Person对象
Set<Person> personSet = new TreeSet<>(new MyComparator());
personSet.add(new Person(15, "zhangsan"));
personSet.add(new Person(12, "lisi"));
personSet.add(new Person(17, "wangwu"));// 因为TreeSet已经按照MyComparator中的排序规则排序,直接打印即可
for (Person person : personSet) {System.out.println(person);
}

compare方法返回值说明

  • 返回负数:表示第一个参数应排在第二个参数之前(升序)。
  • 返回零:表示两个参数相等。
  • 返回正数:表示第一个参数应排在第二个参数之后(升序)。

因此,如果你希望实现升序排序,你需要确保在 compare 方法中返回负数或零。如果返回正数,则会导致降序排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/44421.shtml

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

相关文章

洛谷P10716【MX-X1-T4】「KDOI-05」简单的字符串问题(扩展kmp+set+二分+扫描线树状数组)

题目 思路来源 小羊肖恩 题解 羊神这个做法tql&#xff0c;当时只是机械地写&#xff0c;过了之后再想想&#xff0c;才觉得确实是nb 先扩展kmp&#xff08;Z函数&#xff09;预处理出来数组&#xff0c;记z[i]为i往后可以和前缀匹配的最大长度 对于每个询问(p,cnt)&#x…

centOS79中安装nginx12.15

##red## &#x1f534; 大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff0c;雄雄的小课堂。 前言 装了这么多&#xff0c;发现Nginx是最简单的&#xff0c;一次性就搞定了。下面我们来看看如何安装 安装Nginx 安装gcc-c编译器 分开运行&#xff1a; yum…

anaconda安装pytorch

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

python爬虫入门(三)之HTML网页结构

一、什么是HTML 1、网页的三大技术要素&#xff1a; HTML定义网页的结构和信息&#xff08;骨架血肉&#xff09;CSS定义网页的样式&#xff08;衣服&#xff09;JavaScript定义用户和网页的交互逻辑&#xff08;动作&#xff09; 2、一个最简单的HTML&#xff1a;用<>…

Qt开发 | qss介绍及控件应用 | qss加载方式 | 控件提升 | 鼠标位置与控件位置 | 搜索编辑框 | tab在左文本水平的tabWidget

文章目录 一、qss简介与应用二、QLineEdit qss介绍与使用三、QPushButton qss1.常用qss1.1 基本样式表1.2 背景图片1.3 图片在左文字在右 2.点击按钮弹出菜单以及右侧箭头样式设置3.鼠标悬浮按钮弹出对话框 四、QCheckBox qss妙用&#xff1a;实时打开关闭状态按钮五、QComboBo…

丑数问题,力扣264,坑点

丑数问题&#xff0c;力扣264&#xff0c;坑点 力扣链接 给你一个整数 n &#xff0c;请你找出并返回第 n 个 丑数 。 丑数 就是质因子只包含 2、3 和 5 的正整数。 示例 1&#xff1a; 输入&#xff1a;n 10 输出&#xff1a;12 解释&#xff1a;[1, 2, 3, 4, 5, 6, 8, 9, …

《昇思25天学习打卡营第01天|qingyun201003》

打卡 日期 心得 我的主语言并不是Python,以及现在从事的工作也并不是开发&#xff1b;所以对于这个系列的课程&#xff0c;学习起来是较为困难的&#xff0c;所以基于这种情况&#xff0c;该如何进行学习&#xff1f;我的做法是全部交给AI&#xff0c;使用AI一步步解析代码&a…

java.lang.NullPointerException: null cannot be cast to non-null type kotlin.Int

java.lang.NullPointerException: null cannot be cast to non-null type kotlin.Int fun main(args: Array<String>) {var any1: Any?any1 nullval n1 any1 as? Int ?: -2024println(n1)kotlin.runCatching {var any2: Any?any2 nullval n2 any2 as Intprintln(…

Internet Download Manager6.42最新下载器互联网冲浪小能手们!

今天我要来种草一个超级棒的宝贝——Internet Download Manager&#xff08;简称 IDM&#xff09;。这个小家伙简直是下载界的“速度与激情”代言人&#xff0c;让我彻底告别了等待的日子。&#x1f389; IDM马丁正版下载如下: https://wm.makeding.com/iclk/?zoneid34275 …

299k stars利用Public APIs提升开发效率:探索APILayer提供的开源资源

299k stars利用Public APIs提升开发效率&#xff1a;探索APILayer提供的开源资源 在现代软件开发中&#xff0c;API&#xff08;应用程序接口&#xff09;是实现应用间通信和功能扩展的关键工具。公共API&#xff08;Public APIs&#xff09;则为开发者提供了宝贵的资源&#…

昇思25天学习打卡营第15天|基于 MindSpore 实现 BERT 对话情绪识别

文章目录 昇思MindSpore应用实践1、基于 MindSpore 实现 BERT 对话情绪识别BERT 模型简介数据集数据加载和数据预处理 2、模型训练模型验证 3、模型推理 Reference 昇思MindSpore应用实践 本系列文章主要用于记录昇思25天学习打卡营的学习心得。 1、基于 MindSpore 实现 BERT…

解决IDEA每次新建项目都需要重新配置maven的问题

每次打开IDEA都要重新配置maven&#xff0c;这是因为在DEA中分为项目设置和全局设置&#xff0c;这个时候我们就需要去到全局中设置maven了。我用的是IntelliJ IDEA 2023.3.4 (Ultimate Edition)&#xff0c;以此为例。 第一步&#xff1a;打开一个空的IDEA&#xff0c;选择左…

数据结构day6链式队列

主程序 #include "fun.h" int main(int argc, const char *argv[]) { que_p Qcreate(); enqueue(Q,10); enqueue(Q,20); enqueue(Q,30); enqueue(Q,40); enqueue(Q,50); show_que(Q); dequeue(Q); show_que(Q); printf(&qu…

stm32按键设置闹钟数进退位不正常?如何解决

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

李彦宏: 开源模型是智商税|马斯克: OpenAI 闭源不如叫 CloseAI

在 2024 年世界人工智能大会&#xff08;WAIC 2024&#xff09;上&#xff0c;百度创始人、董事长兼首席执行官李彦宏发表对开源模型的评价。 李彦宏认为&#xff1a;开源模型实际上是一种智商税&#xff0c;而闭源模型才是人工智能&#xff08;AI&#xff09;行业的未来。 马…

如何批量更改很多个文件夹里的文件名中包含文件夹名?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

【学术会议征稿】第五届大数据、人工智能与物联网工程国际会议

第五届大数据、人工智能与物联网工程国际会议 2024 5th International Conference on Big Data, Artificial Intelligence and Internet of Things 第五届大数据、人工智能与物联网工程国际会议&#xff08;ICBAIE 2024&#xff09;定于2024年10月25-27号在中国深圳隆重举行。…

JRT打印药敏报告

最近没写jrt系列博客&#xff0c;不是中途而废了。而是在写微生物系统。今天终于把微生物大体完成了&#xff0c;伴随着业务的实现&#xff0c;框架趋于完善和稳定。构建一套完美而强大的打印体系一直是我的理想&#xff0c;从最开始C#的winform打印控件到刚接触bs时候用js打印…

通过Arcgis从逐月平均气温数据中提取并计算年平均气温

通过Arcgis快速将逐月平均气温数据生成年平均气温数据。本次用2020年逐月平均气温数据操作说明。 一、准备工作 &#xff08;1&#xff09;准备Arcmap桌面软件&#xff1b; &#xff08;2&#xff09;准备2020年逐月平均气温数据&#xff08;NC格式&#xff09;、范围图层数据&…