排序 Comparable 和 Comparator 区别所在

news2024/11/15 12:15:10

在 Java 中,Comparable 和Comparator 都是用来元素排序的,但是本质不用。我们从几点开始分析。

1.字面含义

Comparable 中文翻译是”比较“,以 able 结尾 说明它具有某种能力。

Comparator 中文翻译是”比较器“,以 or 结尾 表明自身就是比较的参与者。 

2.定义不同

他们都是最上层接口。看一下他们对应的接口关系以及所具有的方法吧!

Comparable:

只有一个 compareTo 方法。

 Comparator:

 

 我们关注一下 compare 方法。

实例:

我们先看下下面没有实现两个方法的例子:

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

public class CompareTest {
    public static void main(String[] args) {

        Person person1 = new Person("Java",6,19);
        Person person2 = new Person("Python",1,77);
        Person person3  = new Person("C++",99,45);

        List<Person> list = new ArrayList<>();
        list.add(person1);
        list.add(person2);
        list.add(person3);

        for (Person person : list) {
            System.out.print(person.getId() + " ");
            System.out.print(person.getAge() + " ");
            System.out.print(person.getName() + " ");
            System.out.println();
        }

    }
}

class Person {
    public String name;
    public Integer age;
    public Integer id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

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

上述代码运行结果,如下图所示:

 这里是按照顺序输出的,而没有进行排序操作。

Comparable:

我们刚才看到 Comparable 中只有一个 comparTo 方法,我们要通过这个接口重写 comparTo 实现排序。然后我们可以通过 Collections.sort 或者 Arrays.sort 来进行排序操作.

package code_LeetCode.code_2023_04_22.Test;

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

public class CompareTest {
    public static void main(String[] args) {

        Person person1 = new Person("Java",6,19);
        Person person2 = new Person("Python",1,77);
        Person person3  = new Person("C++",99,45);

        List<Person> list = new ArrayList<>();
        list.add(person1);
        list.add(person2);
        list.add(person3);
        Collections.sort(list);
        for (Person person : list) {
            System.out.print(person.getId() + " ");
            System.out.print(person.getAge() + " ");
            System.out.print(person.getName() + " ");
            System.out.println();
        }

    }
}

class Person implements Comparable<Person> {
    public String name;
    public Integer age;
    public Integer id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

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


    @Override
    public int compareTo(Person o) {
        return o.getAge() - this.getAge();
    }
}

上述代码运行结果如下:

Comparator: 

package code_LeetCode.code_2023_04_22.Test;

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

public class ComparatorTest {
    public static void main(String[] args) {
        Person person1 = new Person("Java",6,19);
        Person person2 = new Person("Python",1,77);
        Person person3  = new Person("C++",99,45);

        List<Person> list = new ArrayList<>();
        list.add(person1);
        list.add(person2);
        list.add(person3);
        Collections.sort(list,new PersonComparator());
        for (Person person : list) {
            System.out.print(person.getId() + " ");
            System.out.print(person.getAge() + " ");
            System.out.print(person.getName() + " ");
            System.out.println();
        }
    }
}

class PersonComparator implements Comparator<Person> {

    @Override
    public int compare(Person o1, Person o2) {
        return o2.getAge() - o1.getAge();
    }
}

这种实现方法需要重写 compare 方法。

执行结果如下图所示:

Comparator 匿名内部类实现方法: 

Comparator 不仅可以通过创建自定义的比较器外,还可以通过匿名类的方法来实现:

package code_LeetCode.code_2023_04_22.Test;

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

public class ComparatorTest {
    public static void main(String[] args) {
        Person person1 = new Person("Java", 6, 19);
        Person person2 = new Person("Python", 1, 77);
        Person person3 = new Person("C++", 99, 45);

        List<Person> list = new ArrayList<>();
        list.add(person1);
        list.add(person2);
        list.add(person3);
        Collections.sort(list, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.age - o2.age;
            }
        });
        for (Person person : list) {
            System.out.print(person.getId() + " ");
            System.out.print(person.getAge() + " ");
            System.out.print(person.getName() + " ");
            System.out.println();
        }
    }
}

上述代码运行结果如下图所示

 

总结:

Comparable 和 Comparator 都是进行元素排序的。

用一句话总结是 Comparable 可以看作是”对内“进行排序接口,而Compaarator 是 ”对外“进行排序的接口,因为比较器可以对所有的要比较的类拿来使用。

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

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

相关文章

【C++ 二十】STL:遍历、查找、排序、拷贝和替换、算术生成、集合算法

STL&#xff1a;遍历、查找、排序、拷贝和替换、算术生成、集合算法 文章目录 STL&#xff1a;遍历、查找、排序、拷贝和替换、算术生成、集合算法前言1 常用遍历算法1.1 for_each1.2 transform 2 常用查找算法2.1 find2.2 find_if2.3 adjacent_find2.4 binary_search2.5 count…

室内人员定位系统源码,采用java语言+UWB定位技术开发

运用UWB定位技术开发的人员定位系统源码 文末获取联系 本套系统运用UWB定位技术开发的高精度人员定位系统&#xff0c;通过独特的射频处理&#xff0c;配合先进的位置算法&#xff0c;可以有效计算复杂环境下的人员与物品的活动信息。 系统提供位置实时显示、历史轨迹回放、人…

循序渐进,学会用pyecharts绘制瀑布图

循序渐进&#xff0c;学会用pyecharts绘制瀑布图 瀑布图简介 瀑布图(Waterfall Plot)是由麦肯锡顾问公司所独创的图表类型&#xff0c;因为形似瀑布流水而称之为瀑布图。 瀑布图采用绝对值与相对值结合的方式&#xff0c;适用于表达多个特定数值之间的数量变化关系。当用户想…

本地Nacos设置脚本命令启动

一、起因&#xff1a; 每次启动都要找到位置写一遍命令费劲。 1、可设置开机启动 2、可设置脚本自动 二、配置脚本&#xff1a; 1、这是我nacos的位置 用bat命令启动一个cmd命令行&#xff0c;然后在里面执行两天命令。 ①命令一&#xff1a;打开指定路径 ②命令二&#xf…

Java图书借阅管理系统详细设计和实现

基于JavaSpringHtml的图书借阅管理系统详细设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源…

cmd连接本地mysql数据库和远程服务器mysql数据库

1.在cmd窗口里连接本地的mysql数据库 打开运行窗口&#xff0c;输入cmd&#xff0c;确定 windowsr 或在左下角windows图标处鼠标右键&#xff0c;点击运行按钮打开运行窗口 格式&#xff1a; mysql -u用户名 -p密码 mysql -uroot -p123456 成功进入mysql 2. 在cmd窗口里连接远…

尚硅谷_宋红康_第17章_反射机制

第17章_反射机制 本章专题与脉络 1. 反射(Reflection)的概念 1.1 反射的出现背景 Java程序中&#xff0c;所有的对象都有两种类型&#xff1a;编译时类型和运行时类型&#xff0c;而很多时候对象的编译时类型和运行时类型不一致。 Object obj new String(“hello”); obj.ge…

Django使用Celery异步发送邮件

Django使用Celery异步发送邮件 前言邮箱配置Django项目发送邮件配置邮件服务器Django发送邮件模块 Celery概述工作模式安装Celery Celery的基本使用创建config.py配置文件创建Celery实例并加载配置定义任务启动Celery服务提交任务异常 Celery发送邮件创建config.py配置文件创建…

机器学习 day05(多元线性回归,向量化,及向量化高效的原理)

1. 单个特征&#xff08;变量&#xff09;的线性回归模型 房子的价格仅由房子的大小决定&#xff0c;如图&#xff1a; 2. 多个特征&#xff08;变量&#xff09;的线性回归模型 房子的价格由房子的大小&#xff0c;房子有多少个卧室&#xff0c;房子有几层&#xff0c;房子…

2023年,逆势拿到大厂Offer,我怎么做?|原创

关于面试&#xff0c;做一些经验分享。 过年时候默默给自己定下了3个目标。第一个就是2023要换一份喜欢的工作。没想到在4月就提前实现了这个目标。 是一个我很看好的大厂&#xff0c;期待的岗位、看好的方向&#xff0c;薪资涨幅也比较给力。最近这段时间没空发文章&#xff0…

MySql中,join 语句怎么优化?

既然每次从驱动表取数据比较耗时&#xff0c;那我们每次从驱动表取一批数据放到内存中&#xff0c;然后对这一批数据进行匹配操作。这批数据匹配完毕&#xff0c;再从驱动表中取一批数据放到内存中&#xff0c;直到驱动表的数据全都匹配完毕 批量取数据能减少很多IO操作&#…

二十三、高级网络技术及应用——BFD解析

文章目录 前言一、BFD 简介1、概述&#xff1a;2、作用&#xff1a; 二、静态路由调用 BFD1、配置静态 BFD2、配置动态 BFD 三、OSPF联动BFD四、BFD 单臂回声&#xff08;one arm echo&#xff09; 前言 BFD&#xff1a;Bidirectional Forwarding Detection&#xff0c;双向转…

奇舞周刊第490期:WebAssembly 多语言/宿主环境中的使用

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞精选 ■ ■ ■ WebAssembly 多语言/宿主环境中的使用 WebAssembly (WASM) 的一个优势就是能够支持将不同语言编译成 WASM 代码&#xff0c;然后在不同的宿主环境中运行。这样就可以在不同的宿主环…

【WSN定位】基于多通信半径和跳距加权优化的Dvhop定位算法【Matlab代码#15】

文章目录 1. 原始Dvhop定位算法2. 多通信半径3. 加权跳距4. 部分代码展示5. 仿真结果展示6. 资源获取 1. 原始Dvhop定位算法 可参考Dvhop定位算法 2. 多通信半径 设网络通信半径为 R R R&#xff0c;将锚节点与邻居节点间分为 m m m级&#xff0c;网络中各信标节点与其邻居节…

Nuxt3用nginx部署到二级目录

有的时候我们需要把我们写的Nuxt3项目部署到域名的二级目录&#xff0c;例如&#xff1a;https://abc.xx.com/abc/目录下。主要就是用nginx进行配置代理转发来实现的&#xff0c;这样可以实现我们同一个域名下可以部署多个Nuxt3独立的项目&#xff0c;只不过端口不同。使用ngin…

Node【Global全局对象】之【Buffer】

文章目录 &#x1f31f;前言&#x1f31f;Buffer&#x1f31f;Buffer介绍&#x1f31f;Buffer对象&#xff1a;类似于数组&#xff0c;其元素是16进制的两位数。&#x1f31f;什么时候用Buffer&#x1f31f;Buffer的转换&#x1f31f;Buffer使用&#x1f31f;创建Buffer&#x…

uniapp 来电显示悬浮窗插件(支持锁屏来电) Ba-CallerID

简介&#xff08;下载地址&#xff09; Ba-CallerID 是一款来电显示悬浮窗插件插件。 支持显示、隐藏支持锁屏来电显示支持自定义位置显示&#xff08;上、中、下&#xff09;支持拖动&#xff08;这版不支持&#xff0c;需要的话可以加&#xff09;支持申请、判断悬浮窗权限…

3个实用的文字转语音方法,让你时刻保持信息更新!

现在&#xff0c;我们生活节奏加快&#xff0c;信息量也越来越大&#xff0c;有时候想了解新闻却又不想眼睛再去盯着手机屏幕了&#xff0c;这时候文字转语音工具就可以帮助我们实现听新闻的需求。如果你还不了解文字如何转换成语音&#xff0c;别担心&#xff0c;今天我将向大…

JavaSE注解和反射

注解分类和说明点 注解&#xff1a;可对程序做解释可被其他程序读取 元注解&#xff1a;Target&#xff1a;表明注解的使用范围&#xff0c;Retention&#xff1a;表示要在什么级别保存注解信息&#xff0c;Document&#xff0c;Inherited 自定义注解&#xff1a;interface …

P1027 [NOIP2001 提高组] Car 的旅行路线

题目描述 又到暑假了&#xff0c;住在城市 A 的 Car 想和朋友一起去城市旅游。 她知道每个城市都有 44 个飞机场&#xff0c;分别位于一个矩形的 44 个顶点上&#xff0c;同一个城市中两个机场之间有一条笔直的高速铁路&#xff0c;第 &#xfffd;i 个城市中高速铁路了的单位…