Java 中 Comparator 与 Comparable区别

Java中Comparable和Comparator接口的区别 Comparable 简介 Comparable 是排序接口 若一个类实现了Comparable接口,就意味着“该类支持排序”。此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。 接口中通过x.compareTo(y)来比较x和y的大小。若返回负数,意味着x比y小;返回零,意味着x等于y;返回... 阅读详情

简介

比较Comparator 与 Comparable接口。

示例

创建一个Player 类,并加入ArrayList

public class TestLearnJava {
    public static void main(String[] args) {
        List<Player> footballTeam = new ArrayList<>();
        Player player1 = new Player(59, "John", 20);
        Player player2 = new Player(67, "Roger", 22);
        Player player3 = new Player(45, "Steven", 24);
        footballTeam.add(player1);
        footballTeam.add(player2);
        footballTeam.add(player3);

        System.out.println("Before Sorting : " + footballTeam);
        Collections.sort(footballTeam);
        System.out.println("After Sorting : " + footballTeam);
    }
}

class Player {
    private int ranking;
    private String name;
    private int age;

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

    public int getRanking() {
        return ranking;
    }

    public void setRanking(int ranking) {
        this.ranking = ranking;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

输出

java: 对于sort(java.util.List<com.xx.learn.Player>), 找不到合适的方法
    方法 java.util.Collections.<T>sort(java.util.List<T>)不适用
      (推论变量 T 具有不兼容的上限
        等式约束条件:com.xx.learn.Player
        下限:java.lang.Comparable<? super T>)
    方法 java.util.Collections.<T>sort(java.util.List<T>,java.util.Comparator<? super T>)不适用
      (无法推断类型变量 T
        (实际参数列表和形式参数列表长度不同))

Comparable

正如命名所描述,Comparable是一个接口,定义一个策略用来比较相同的对象。这个被称为【自然排序】(natural ordering)。

所以,为了排序必须将类Player实现Comparable接口。

public class TestLearnJava {
    public static void main(String[] args) {
        List<Player> footballTeam = new ArrayList<>();
        Player player1 = new Player(59, "John", 20);
        Player player2 = new Player(67, "Roger", 22);
        Player player3 = new Player(45, "Steven", 24);
        footballTeam.add(player1);
        footballTeam.add(player2);
        footballTeam.add(player3);

        System.out.println("Before Sorting : " + footballTeam);
        Collections.sort(footballTeam);
        System.out.println("After Sorting : " + footballTeam);
    }
}

class Player implements Comparable<Player> {
    @Override
    public int compareTo(Player otherPlayer) {
        return Integer.compare(getRanking(), otherPlayer.getRanking());
    }

    private int ranking;
    private String name;
    private int age;

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

    public int getRanking() {
        return ranking;
    }

    public void setRanking(int ranking) {
        this.ranking = ranking;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

输出

Before Sorting : [com.xx.learn.Player@6d311334, com.xx.learn.Player@682a0b20, com.xx.learn.Player@3d075dc0]
After Sorting : [com.xx.learn.Player@3d075dc0, com.xx.learn.Player@6d311334, com.xx.learn.Player@682a0b20]

Comparator

Comparator接口定义了一个compare(arg1, arg2)方法。

示例

public class TestLearnJava {
    public static void main(String[] args) {
        List<Player> footballTeam = new ArrayList<>();
        Player player1 = new Player(59, "John", 20);
        Player player2 = new Player(67, "Roger", 22);
        Player player3 = new Player(45, "Steven", 24);
        footballTeam.add(player1);
        footballTeam.add(player2);
        footballTeam.add(player3);

        System.out.println("Before Sorting : " + footballTeam);
        PlayerRankingComparator playerComparator = new PlayerRankingComparator();
        Collections.sort(footballTeam, playerComparator);
        System.out.println("After Sorting : " + footballTeam);
    }
class PlayerRankingComparator implements Comparator<Player> {

    @Override
    public int compare(Player firstPlayer, Player secondPlayer) {
        return Integer.compare(firstPlayer.getRanking(), secondPlayer.getRanking());
    }
}

class PlayerAgeComparator implements Comparator<Player> {
    @Override
    public int compare(Player firstPlayer, Player secondPlayer) {
        return Integer.compare(firstPlayer.getAge(), secondPlayer.getAge());
    }
}

输出

Before Sorting : [com.xx.learn.Player@6d311334, com.xx.learn.Player@682a0b20, com.xx.learn.Player@3d075dc0]
After Sorting : [com.xx.learn.Player@3d075dc0, com.xx.learn.Player@6d311334, com.xx.learn.Player@682a0b20]

Java 8 Comparator使用方式

Comparator<Player> byRanking = Comparator
                .comparing(Player::getRanking);

Comparator vs Comparable比较

当不能修改类的源代码时,又需要排序,则使用Comparator,否则使用comparable

当需要不同的比较策略时,可以使用Comparator

参考链接:https://www.baeldung.com/java-comparator-comparable

【openEuler容器镜像部署指南】 【代码】【List集合排序 】 阅读详情

相关推荐

别再到处找模板了!手把手教你用Vue3+Element Plus搭建一个‘能跑起来’的管理后台原型

本文详细介绍了如何利用Vue3和Element Plus在72小时内快速搭建一个功能完整的管理后台原型。从环境准备到项目获取、依赖安装、原型定制、数据模拟以及构建优化,手把手教你打造一个可直接演示的后台系统,特别适合创业者快速验证产品逻辑。

weixin_26854555的博客 182

java.util的Collections类的两种sort方法使用

在java.util中有Collections类,包含可以操作或返回集合的专用静态类,其中有两类sort方法; 注意:java.util.Arrays中也有用于数组比较的多种sort类 1、第一类sort的API解释: public static Comparable> void sort(List list) 根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必

u011140430的专栏 1483

在 Dify 平台部署一个 知识库问答(KBQA) 工作流

加强检索约束,Prompt 加限制(“仅基于知识库回答”):启用缓存,使用轻量级 LLM(如 Mistral-7B)(OpenAI Embedding、M3E、BGE等)(支持 PDF/TXT/Markdown/Word)(GPU/CPU 资源,用于向量数据库和模型推理)企业内部文档(PDF/Word/Excel)网页爬取数据(Markdown/HTML)分块大小(太小→信息碎片化,太大→噪声多)相似度阈值(太高→漏检,太低→噪声多)(是否返回正确文档)结构化数据(数据库/API)

井底小蛙的博客 1520

java list 参数传递 排序 无效_java – 错误消息:类型集合中的方法sort(List)不适用于参数(ArrayList)...

继续收到错误消息,但不知道为什么.无法使用Collections.sort()获取代码来对列表进行排序这就是我所拥有的. 3个java文件.接口文件.public interface Comparable {public int compareTo(T other);}类文件.public class Date implements Comparable{private int year;priv...

weixin_39700397的博客 851

6、Dialogflow 开发全解析:从基础到高级应用

本文全面解析了 Dialogflow 的核心功能与高级应用,涵盖意图与实体的创建、上下文管理、后续意图设置以及高级实体类型的实际应用场景。详细介绍了自定义实体的导入导出规则、编程添加方法及数量限制,并通过流程图和实例说明了上下文生命周期与对话连贯性设计。结合电商、旅游、问卷调查等实际业务场景,展示了模糊匹配、自动扩展、复合实体等功能的强大灵活性。最后提供了开发最佳实践建议,帮助开发者构建高效、智能的对话系统。

kafka6courier的博客 104

ResNet改进(20):融合Swin Transformer与ResNet

这种混合架构的设计理念是:在保留CNN强大局部特征提取能力的同时,引入Transformer的全局建模优势。我们实现的模型在ResNet18的基础上嵌入了一个简化版的Swin Transformer Block,旨在探索两种范式结合的可能性。通过在ResNet早期阶段引入Transformer模块,我们既保留了CNN强大的局部特征提取能力,又获得了Transformer的全局建模优势。本文提出的ResNet与Swin Transformer混合架构,探索了CNN与Transformer结合的可能性。

2401_82355416的博客 859

JDK中 java.util.Collections类的sort方法

java.util 类 Collections java.lang.Object java.util.Collections public class Collectionsextends Object 此类完全由在 collection 上进行操作或返回 collection 的静态方法组成。它包含在 collection 上操作的多态算法,即“包装器”,包装

Gatherfly 的博客 1135

KingSCADA实现按钮点击效果

哈喽,你好啊,我是雷工!在做SCADA项目的时候,按钮是不可缺少的功能,但软件自带的按钮太丑,已经无法满足现如今客户对界面美观度的要求。这时候就需要UI小姐姐设计美观大气的SCADA界面,但UI设计的按钮切图放到程序中只是图片素材,当添加了按钮功能时,虽然能实现按钮功能,但没有任何点击效果;当遇到有需要连锁条件才能点击的按钮时,操作员无法区分是有连锁点击了没反应,还是系统界面卡死了导致的没点击成功,这时候有点击效果就能很好的区分这种问题。本篇介绍一种实现按钮点击效果的方法,以下为操作过程。

做有价值的事,积累有价值的笔记! 2765

java排序使用java.util.Collections进行排序

首先新建一个类进行做比较用 如果是 String类型的话就调用   compareTo()    这个方法 o2.getVersionBack().compareTo(o1.getVersionBack());如果是int 类型的话    o2.getVersion() - o1.getVersion();public class demo implements Comparator&lt;Ver...

XiLinCao的博客 630

PLC为西门子的S7-1200,舵机为 DS3218,PLC控制舵机旋转程序实现?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 999

用python画年度和月度的日历图

用python画各种日历图,可以区分月份来画也可以画一整年的,日历图中可以体现自己的信息

weixin_44853840的博客 2138

java.util.Collections.sort(List list)类的应用(与Comparable,Comparator比较)

Java.util.Collections.sort(List list)与Comparable,Comparator 接口 调用java.util.Collections.sort(List list)方法来进行排序的时候:List内的Object都必须实现了Comparable接口。否则出现下面的错误:java.lang.ClassCastExceptionat java.

lovesaxphone的专栏 906

图神经网络学习笔记-点云数据处理(专题七)

本教程解释了如何利用图神经网络(Graph Neural Networks,GNNs)来处理和训练点云数据。尽管点云默认情况下不具有图结构,但我们可以利用 PyG 的转换工具,将其转化为适合 PyG 所提供的全套 GNN 模型的形式。关键思想是从点云数据中创建一个,通过 GNN 的消息传递机制,从中学习有意义的局部几何结构。这些点的表示可以被用于例如点云分类或分割等任务。

351

java中Comparable和Comparator的区别

文章目录简介ComparableComparator举个例子 java中Comparable和Comparator的区别 简介 java.lang.Comparable和java.util.Comparator是两个容易混淆的接口,两者都带有比较的意思,那么两个接口到底有什么区别,分别在什么情况下使用呢? Comparable Comparable是java.lang包下面的接口,lang包下面可...

程序那些事 9561

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JAVA中Comparable和 Comparator的区别

JAVA中的Comparable 和 Comparator

Yusean_L的博客 3435

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java 中Comparator 和 Comparable接口的区别

Java 中Comparator 和 Comparable接口的区别

weixin_42320587的博客 704

Java中Comparator和Comparable之间的区别

常见的面试问题之一是“比较器和可比较器之间有什么区别”。 或“您将如何通过其ID或名称对员工对象集合进行排序”。为此,我们可以使用两个接口,即Comparator和Comparable。在我们真正看到差异之前,让我简要介绍两者。 可比接口:要对其进行排序的对象的类必须实现此接口。在此,我们必须实现compareTo(Object)方法。 例如: public class Count...

最佳 Java 编程 779

Java中的Comparable与Comparator的区别

Comparable和Comparable都是Java核心API提供的两个接口。从其名字来看,可以知道这两个接口在一定程度上都是用来比较东西的。但究竟是什么,什么是它们之间的区别?下面是两个例子来回答此问题。简单的例子是比较两个高清晰度电视的大小。如何使用Comparable和Comparator?我想当你读完下面的叙述,就会明白怎么用了。 1.Comparable Comparabl

sunling_sz的专栏 4万+

Java中Comparable和Comparator区别

Comparable只有一个方法 public int compareTo(T o);compareTo方法的返回值是int,有三种情况:1、比较者(调用compareTo方法者)大于被比较者(也就是compareTo方法接受对象),那么返回 12、比较者等于被比较者,那么返回03、比较者小于被比较者,那么返回 -1Comparable可以认为是一个内比较器,很多类都会实现这个接口以提供对该类对象

Vincent 4453

java Comparator 和 Comparable 区别

两种方法各有优劣。用Comparable简单,只要实现Comparable接口的对象直接就成为一个可以比较的对象,但是需要修改源代码,用Comparator的好处是不需要修改源代码,而是另外实现一个比较器,当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了,并且在Comparator里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。...

Tec Log 276

java comparable与_Java中Comparable与Comparator的区别

一、概述Comparable和Comparator都是用来实现集合中元素的比较、排序的。Comparable是在集合内部定义的方法实现的排序,位于java.lang下。Comparator是在集合外部实现的排序,位于java.util下。Comparable是一个对象本身就已经支持自比较所需要实现的接口,如String、Integer自己就实现了Comparable接口,可完成比较大小操作。自定义...

weixin_33816734的博客 685

Java中Comparable和Comparator的区别

Comparable和Comparator都是用于比较数据的大小的,实现Comparable接口需要重写compareTo方法,实现Comparator接口需要重写compare方法,这两个方法的返回值都是int,用int类型的值来确定比较结果,在Collections工具类中有一个排序方法sort,此方法可以之传一个集合,另一个重载版本是传入集合和比较器,前者默认使用的就是Com...

zhuzj12345的博客 241

Java Comparator和Comparable的区别

Java Comparator和Comparable的区别 使用区别: Comparable & Comparator 都是用来实现集合中元素的比较、排序的; Comparable 是在集合内部定义的方法实现的排序, Comparator 是在集合外部实现的排序, 所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。 Comparable定义: package java.lang; import java.util.*; pub

Crashyi的博客 510

java comparable与_详解Java中Comparable和Comparator接口的区别

详解Java中Comparable和Comparator接口的区别本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧。Comparable 简介Comparable 是排序接口。若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排...

weixin_34987986的博客 534

Java里Comparator与Comparable有什么区别?

Java里Comparator与Comparable有什么区别?

java1234的博客 677

Java中Comparable与Comparator的区别

一、概述 Comparable和Comparator都是用来实现集合中元素的比较、排序的。 Comparable是在集合内部定义的方法实现的排序,位于java.lang下。 Comparator是在集合外部实现的排序,位于java.util下。 Comparable是一个对象本身就已经支持自比较所需要实现的接口,如String、Integer自己就实现了Comparable接口,可完成比较大小操...

吻得太逼真的博客 223
上一篇: java 创建对象的几种方式
下一篇: Java Collection教程
sumup
博客等级 码龄9年 5粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值