首页 > 其他分享 >比较器-Comparable和Comparator

比较器-Comparable和Comparator

时间:2024-11-13 14:47:08浏览次数:1  
标签:Comparable name Comparator age public Person new 比较

Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。可以使用Arrays.sort()对改类进行排序

1.Comparable接口

使用场景:假如说我们有这样一个需求,需要设计一个Person类,有两个属性:姓名(name)、年龄(age),按照年龄的大小进行排序,那么实现可以这样

注意:

public class Person implements Comparable<Person>{

    private String name;

    private int age;

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Person o) {
        if (this.age > o.age) {
            return 1;
        } else {
            return -1;
        }
//        return Integer.compare(this.age, o.age);
    }
}


public static void main(String[] args) {
    Person[] people = new Person[]{
            new Person("张三",25),
            new Person("李四",17),
            new Person("王五",35),
    };
    Arrays.sort(people);
    System.out.println(Arrays.toString(people));
}

Comparable接口里面有一个泛型T,T的选择为可以与之比较的对象的类型,一般就是实现该接口类的本身,可以这样想和Person类比较的当然是Person本身了。

2.Comparator接口

Comparator也是一个比较器,但是属于挽救设计的一种,一般来说尽量减少。

使用场景:假如说我们有这样一个需求,需要对Person类的年龄进行排序,但是Person类是别人写好的,里面没有Comparable接口,如果在不允许改变源代码的情况下,我们可以使用Comparator接口。

public class Person {

    private String name;

    private int age;

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class PersonComparator implements Comparator<Person> {

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


public static void main(String[] args) {
    Person[] people = new Person[]{
            new Person("张三",25),
            new Person("李四",17),
            new Person("王五",35),
    };
    Arrays.sort(people, new PersonComparator()); // 这里需要加入比较器
    System.out.println(Arrays.toString(people));
}

// 当然上述的类为了方便查看,所以专门写出来,可以看到PersonComparator类中只有一个方法,可以使用匿名类的方式来进行编写

public static void main(String[] args) {
    Person[] people = new Person[]{
            new Person("张三",25),
            new Person("李四",17),
            new Person("王五",35),
    };
    Arrays.sort(people, (p1, p2)-> Integer.compare(p1.getAge(), p2.getAge())); // 这样写就不需要类比较器了
//    Arrays.sort(people, Comparator.comparing(Person::getAge)); // 最简写法
    System.out.println(Arrays.toString(people));
}

总结
Comparable和Comparator的区别:

java.lang.Comparable:在类定义的时候,可以实现好的接口,里面有compareTo这个方法需要实现。

java.util.Comparator:是挽救的比较接口,需要单独定义一个比较类,里面有compare比较方法。

在设计阶段,我们使用比较多的是Comparable接口。

但在实际开发过程中的话,我们通常使用匿名内部类的方式,所以更多使用的是Comparator,不过一般是在算法题中使用,真正在项目中使用的情况确实不多。

参考:

https://blog.csdn.net/qq_41474648/article/details/105182845

标签:Comparable,name,Comparator,age,public,Person,new,比较
From: https://www.cnblogs.com/HomeOFMarmot/p/18543918

相关文章

  • 电线、硬铜线和铜丝线是常见的电气连接和传导材料,它们在结构、用途、性能等方面有所不
    硬铜线与铜丝线的对比表格:特点硬铜线铜丝线材质纯铜(未经过退火处理)由多根细铜丝编织而成柔韧性较差,硬且不容易弯曲较好,具有较好的弯曲能力导电性良好,铜的导电性优异良好,铜的导电性优异抗拉强度高,适合高负载和长距离传输较低,柔性较好但抗拉强度差耐......
  • 探索jQuery与原生JavaScript:事件绑定的比较
    探索jQuery与原生JavaScript:事件绑定的比较在现代网页开发中,事件处理是实现用户交互的关键部分。开发者可以选择使用原生JavaScript或jQuery来绑定事件。本文将通过一个简单的示例,比较这两种方法在事件绑定上的不同,并探讨它们的优缺点。事件绑定基础事件绑定是将事件监听......
  • Java中2个Integer比较相同的4种方式
    Java中2个Integer比较相同的4种方式概要使用前切记Integer的范围是【-128~127】例如:Integera=128;Integerb=128;1,使用==比较【-128~127】区间内返回true,否则返回false//==比较if(a==b){System.out.println("a,b使用==比较返回结果:true");......
  • excel 字符比较函数
    ‌在Excel中,用于字符比较的函数主要有以下几种‌:‌EXACT函数‌:用于比较两个文本字符串是否完全相同,包括大小写。如果两个字符串完全相同(包括大小写),则返回TRUE;否则返回FALSE。例如,=EXACT("ABC","abc")的结果为FALSE,而=EXACT("ABC","ABC")的结果为TRUE‌12。‌FIND函数‌:用......
  • 2024年CRM系统全球排名:国内外十大品牌深度比较
    当前,国内外CRM系统市场呈现出百花齐放的景象。种类繁多的CRM系统满足了不同企业的多样化需求。在国外,CRM系统发展较早且较为成熟。其发展历程经历了数据库营销时代、联系管理软件时代、自动化销售力支持系统时代、全方位CRM系统时代以及云计算和移动技术时代。国外市场上的......
  • 如何系统的从0到1学习大模型?相关书籍及课程那些比较好?非常详细收藏我这一篇就够了!
    大模型这个概念我是从去年这时候才了解到的,在不知道大模型之前,我甚至以为chatGPT和大模型就是同一个东西,是可以划等号的。直到国内的AI产品一茬又一茬的冒出来,我才在使用的过程中逐渐对大模型这个概念有了认识。而大模型是一个广泛的概念,涵盖了所有参数众多、能够执行复杂任......
  • 【MQTT】代理服务比较RabbitMQ、Mosquitto 和 EMQX
    前言目前要处理大量设备同时频繁发送数据的情况,MQTT协议确实是一个更优的选择,因为它特别适合需要低带宽和高效能的物联网应用,下面是对目前主流协议的对比数据截止日期:2024年11月10日基础设施后端:springcloud项目设备端:IOT设备,每秒上报数据对比项特性RabbitMQMosqui......
  • 844. 比较含退格的字符串
    题目说实话自己在尝试这道题的时候没什么清晰的思路和实现方法。看了官方题解,官方提供了两种方法:方法一:这个重构字符串刚开始也想到了,但是不知道怎么去实现,看了官方题解后,不禁一颤,噢,这是栈的运用啊,仔细想想,也觉得退格带来的效果真的很像栈顶元素的弹出。官方代码如下:class......
  • 【CRM系统选型指南:国内八大主流工具比较】
    本文将对十大主流CRM系统进行比较:纷享销客、ZohoCRM、Pipedrive、简信CRM、HubSpotCRM、八百客CRM、金蝶CRM、浪潮CRM、销售易CRM本文将深入评比2024年主流的CRM系统,帮助你了解各系统之间的主要区别、优缺点以及当前的发展趋势。通过详细的比较和分析,为你提供一个清晰的......
  • 最短路径算法综述:原理、比较与实现
    最短路径算法综述:原理、比较与实现一、引言在图论和计算机科学领域,最短路径问题是一个经典且重要的研究内容。它在交通导航、网络路由、物流规划等众多实际应用场景中有着广泛的应用。本文将详细介绍几种常见的最短路径算法,包括Dijkstra算法、Bellman-Ford算法、Floy......