Java之集合的排序方式(Comparable和Comparator的基本使用以及区别)

文章目录

  • 一、Comparable接口:
    • 1. 代码示例:
    • 2. 运行结果:
    • 3. 案例分析:
  • 二、Comparator接口:
    • 1. 代码示例:
    • 2. 运行结果:
    • 3. 案例分析:
  • 三、Comparable和Comparator对比:
    • 1. 接口位置:
    • 2. 实现方式:
    • 3. 排序方式:
    • 4. 对象类型:

一、Comparable接口:

Comparable接口是Java中的一个接口,用于实现对象的比较。它定义了一个compareTo()方法,用于比较当前对象与另一个对象的大小关系。

使用Comparable接口可以实现自定义类的比较功能,比如可以根据某个属性进行排序,或者判断两个对象的大小关系。

1. 代码示例:

下面是一个示例的代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Person implements Comparable<Person> {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public int compareTo(Person otherPerson) {
        // 比较年龄
        if (this.age > otherPerson.age) {
            return 1;
        } else if (this.age < otherPerson.age) {
            return -1;
        } else {
            // 年龄相等时比较姓名
            return this.name.compareTo(otherPerson.name);
        }
    }
}

public class ComparableDemo {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("Alice", 25));
        personList.add(new Person("Bob", 20));
        personList.add(new Person("Charlie", 30));

        // 使用Collections.sort()方法进行排序
        Collections.sort(personList);

        // 打印排序结果
        for (Person person : personList) {
            System.out.println(person.getName() + " - " + person.getAge());
        }
    }
}

2. 运行结果:

comparable

3. 案例分析:

  1. 在上面的例子中,我们创建了一个Person类,实现了Comparable接口,并重写了==compareTo()==方法。在compareTo()方法中,我们首先比较了两个Person对象的age属性,如果age不同,直接返回比较结果;如果age相同,再比较name属性。

  2. 在main方法中,我们创建了一个Person对象的List,并添加了几个Person对象。然后使用Collections.sort()方法对List进行排序,由于Person类实现了Comparable接口,可以直接使用该方法进行排序。最后,我们打印排序结果,可以看到Person对象按照年龄升序排列。

  3. 这个例子演示了如何使用Comparable接口进行对象的比较和排序。通过实现Comparable接口,我们可以根据自定义的规则对对象进行排序,或者判断两个对象的大小关系。这在很多场景下都非常有用,比如对一组对象按照某个属性进行排序,或者在集合中查找最大/最小值等。

二、Comparator接口:

Comparator接口是Java中的一个接口,它用于比较两个对象的大小。在使用Comparator时,我们需要实现该接口并重写其中的compare方法。compare方法接受两个参数,分别是要比较的两个对象,返回一个整数值来表示比较结果。

Comparator的使用场景主要有两种:
1、对于没有实现Comparable接口的类,我们可以通过Comparator来定义对象的比较规则;
2、对于已经实现Comparable接口的类,我们可以通过Comparator来定义其他比较规则。

1. 代码示例:

下面是一个使用Comparator的示例代码,来比较一个学生对象的年龄:


2. 运行结果:

comparator

3. 案例分析:

  1. 以上代码中,我们定义了一个Student类,其中包含了姓名和年龄两个属性。然后我们创建了一个AgeComparator类,实现了Comparator接口,并重写了compare方法,比较了两个学生对象的年龄。在主函数中,我们创建了一个学生对象的列表,然后使用Collections的sort方法,传入了我们定义的比较器,实现了对学生对象的年龄进行排序。最后,我们打印排序后的学生对象。

  2. 这个示例中,我们使用Comparator实现了对学生对象的年龄进行排序。我们也可以根据其他属性来定义比较器,比如根据姓名、成绩等等。使用Comparator可以灵活地定义对象的比较规则,适用于各种排序和比较需求。

三、Comparable和Comparator对比:

Comparable和Comparator都是用于排序的接口,但它们有以下几个区别:

1. 接口位置:

Comparable接口位于被比较的类的内部,而Comparator接口是一个独立的接口。

2. 实现方式:

Comparable接口是在被比较的类内部实现的,它定义了对象自己的自然排序规则;而Comparator接口是通过外部实现的,可以为同一个类实现多个Comparator接口,每个Comparator实现定义一种不同的排序规则。

3. 排序方式:

当使用Comparable接口进行排序时,排序规则是固定的,不能在运行时改变。而使用Comparator接口进行排序时,可以根据需要定义不同的排序规则,程序运行时可以根据不同的比较器进行不同的排序。

4. 对象类型:

Comparable接口只能用于对同一个类的对象进行比较和排序。而Comparator接口可以用于对任意类的对象进行比较和排序,无需修改被比较的类的源代码。
排序啊

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文心一言 VS 讯飞星火 VS chatgpt (64)-- 算法导论6.5 3题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;64&#xff09;-- 算法导论6.5 3题 三、要求用最小堆实现最小优先队列&#xff0c;请写出 HEAP-MINIMUM、HEAP-EXTRACT-MIN、HEAP DECREASE-KEY 和 MIN-HEAP-INSERT 的伪代码。 文心一言&#xff1a; 以下是使用最小堆实现最小…

UE5 AI移动无动作问题

文章目录 问题背景解决方法问题背景 在使用行为树让角色移动时,出现角色行走不播放动作的情况: 解决方法 其实有2个问题导致出现这种情况 1、角色动画蓝图的问题 角色动画蓝图可能存在4个问题: ① 无播放行走动画 ② 速度的值未正常传递 ③ 播放移动动作逻辑的值判断错…

qt与opencv学习记录

qtopencv开发入门&#xff1a;4步搞定环境配置-1_哔哩哔哩_bilibili qtopencv开发入门&#xff1a;4步搞定opencv环境配置2_哔哩哔哩_bilibili 文章内容来自上面两个视频&#xff0c;感谢创作者。 ps&#xff1a;配置环境的过程中&#xff0c;遇到了很多问题&#xff0c;我…

90道渗透测试面试题(附答案)

2023年已经快过去一半了&#xff0c;不知道小伙伴们有没有找到自己心仪的工作呀。最近后台收到不少小伙伴说要我整理一些渗透测试的面试题&#xff0c;今天它来了&#xff01;觉得对你有帮助的话记得点个赞再走哦~ 1、什么是渗透测试&#xff1f; 渗透测试是一种评估计算机系统…

C—数据的储存(下)

文章目录 前言&#x1f31f;一、练习一下&#x1f30f;1.例一&#x1f30f;2.例二&#x1f30f;3.例三&#x1f30f;4.例四 &#x1f31f;二、浮点型在内存中的储存&#x1f30f;1.浮点数&#x1f30f;2.浮点数存储&#x1f4ab;&#xff08;1&#xff09;.二进制浮点数&#x…

Meshlab查看三维点云时 ,换背景颜色

Meshlab&#xff0c;一般默认背景颜色是深色&#xff0c; tools->options-> 就可以调meshlab的背景颜色了 双击 图中 标号①&#xff0c; 接着弹出当前颜色框&#xff0c;双击标号②&#xff0c;出现对话框三&#xff0c;可以选择颜色 这里 更换白色背景&#xff0c; …

TSDB - VictoriaMetrics 技术原理浅析

一、前言 在监控领域&#xff0c;通常需要指标存储组件TSDB&#xff0c;目前开源的TSDB组件比较多&#xff0c;各个组件性能、高可用性、维护成本等等各有差异。本文不分析选型问题&#xff0c;重点讲解VictoriaMetrics&#xff08;后面简称为vm&#xff09;。 有兴趣的朋友建议…

第一百一十二天学习记录:数据结构与算法基础:循环链表和双向链表以及线性表应用(王卓教学视频)

循环链表 带尾指针循环链表的合并 双向链表 单链表、循环链表和双向链表的时间效率比较 顺序表和链表的比较 链式存储结构的优点 1、结点空间可以动态申请和释放&#xff1b; 2、数据元素的逻辑次序靠结点的指针来指示&#xff0c;插入和删除时不需要移动数据元素。 链式存储…

去括号问题(C++处理)

继http://t.csdn.cn/kIcUT后的文章 题目描述 当老师不容易&#xff0c;尤其是当小学的老师更难:现在的小朋友做作业喜欢滥用括号。 虽然不影响计算结果&#xff0c;但不够美观&#xff0c;容易出错&#xff0c;而且可读性差。但又不能一棒子打死&#xff0c;也许他们就是将来的…

多目标灰狼算法(MOGWO)的Matlab代码详细注释及难点解释

目录 一、外部种群Archive机制 二、领导者选择机制 三、多目标灰狼算法运行步骤 四、MOGWO的Matlab部分代码详细注释 五、MOGWO算法难点解释 5.1 网格与膨胀因子 5.2 轮盘赌方法选择每个超立方体概率 为了将灰狼算法应用于多目标优化问题,在灰狼算法中引入外部种群Archi…

extern “C“的作用效果

代码 1.cpp #include <string.h>struct s {char data1;short data2;int data3;long data4; };// 定义C函数&#xff0c;汇编符号标头由g编译器按规则生成 void fun(void) {struct s src;src.data1 A;src.data2 2;src.data3 3;src.data4 4;struct s res;memcpy(&…

深度学习——过拟合和Dropout

基本概念 什么是过拟合&#xff1f; 过拟合&#xff08;Overfitting&#xff09;是机器学习和深度学习中常见的问题之一&#xff0c;它指的是模型在训练数据上表现得很好&#xff0c;但在未见过的新数据上表现较差的现象。 当一个模型过度地学习了训练数据的细节和噪声&#…

web地理信息系统开发开源架构设计

Web端地理信息软件系统研发一般包括前端展示、后端服务、地图服务、数据库等几大部分。为了节约项目经费&#xff0c;实现地理信息软件项目研发&#xff0c;采用了开源技术路线&#xff0c;通过对比&#xff0c;采用如下开发架构&#xff1a; 1、前端展示 前端展示采用angular…

FTP与HTTP: 哪种协议更适合大文件传输?

随着互联网技术的发展&#xff0c;网络传输已成为了现代社会中不可或缺的一部分。无论是文本、图像、音频、视频等各种类型的数据&#xff0c;相应的传输协议也在不断地发展和更新。FTP&#xff08;File Transfer Protocol&#xff09;和HTTP&#xff08;Hyper Text Transfer P…

java电子病历系统源码

电子病历系统采取结构化与自由式录入的新模式&#xff0c;自由书写&#xff0c;轻松录入。化实现病人医疗记录&#xff08;包含有首页、病程记录、检查检验结果、医嘱、手术记录、护理记录等等。&#xff09;的保存、管理、传输和重现&#xff0c;取代手写纸张病历。不仅实现了…

EGE-UNet, 轻量化U-Net

随着transform 的出现&#xff0c;现在语义分割网路结构越来越复杂&#xff0c;轻量化网路也较少了&#xff0c;有些轻量化也只是名义上的轻量化。今天我看到一篇很好的论文&#xff0c;上海交大发表在 MICCAI 2023 的最新研究工作&#xff0c;一个称为Efficient Group Enhance…

信息与通信工程学科面试准备——通信原理|信息与通信工程方向保研面试题集|BUAA

注意&#xff1a; 以下内容&#xff0c;基本上都是二系通信方向保研复试被提问过的内容。如果是专硕&#xff0c;那么电路分析、电磁场、DSP等方面的问题会更多&#xff0c;这里主要针对通信学硕。以下内容不能保证全覆盖&#xff1a;有的同学被问到什么是范德蒙行列式&#x…

html a标签换行显示

文章目录 用css display属性不用css&#xff0c;可以用<br>标签换行示例 用css display属性 可以使用CSS的display属性来实现多个a标签每行显示一个。 HTML代码&#xff1a; <div class"link-container"><a href"#">Link 1</a>…

前端工程化第一章:webpack5基础(上)

文章目录 1. 什么是webpack&#xff1f;2. webpack使用2.2. 前置知识2.1. 创建一个项目 3. webpack打包3.1. 创建一个webpack.config.js文件3.2. 入口&#xff08;entry&#xff09;3.2.1. webpack.config.js3.2.2. src/index.js3.2.3. package.json 3.3. 输出&#xff08;outp…

基于深度学习的高精度课堂人脸检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度课堂人脸检测系统可用于日常生活中或野外来检测与定位课堂人脸目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的课堂人脸目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标…