Comparable与Comparator接口

Comparabler 和 Comparator接口是我们的比较器接口,在讲述优先级队列时我们提到过传入一个比较器。那么什么是比较器,怎么用?怎么实现对象的比较?这篇文章将会介绍 Comparator 和 Comparable 的基本使用和操作

Comparatble

我们先来看一下这个接口的描述。
在这里插入图片描述
该接口对实现它的每个类的对象强制执行总排序。这种排序称为类的自然排序,类的 compareTo 方法称为类的自然比较法.

compareTo()

将此对象与指定的order对象进行比较。返回一个负整数、零或正整数,因为该对象小于、等于或大于指定的对象。
最后,实现者必须确保 x.compareTo(y)==0 意味着 sgn(x.compareTo(z)) == sgn(y. compareto (z)),对于所有 z

这些话生涩难懂吧,我们用简单的代码实现一下。

public class A implements  Comparable<A>{
    public A(int id, int age, String name) {
        this.id = id;
        this.age = age;
        this.name = name;
    }

    int id;
    int age;
    String name;

    @Override
    public int compareTo(A o) {
        if(this.age > o.age){
            return 1;
        }
        else if(this.age == o.age){
            return 0;
        }
        else  return -1;
    }
}

这里我定义了一个A类,属性有id,age,name。我向判断当前对象和另一个对象谁的 age 大,让这个类实现了Comparable接口重写了compareTo()方法。如果当前对象的age 大于 另一个对象的age,返回 1 ;相等,返回 0 ;小于返回 -1 。

我们来测试一下。

 public static void main(String[] args) {
        A a1 = new A(0,18,"张三");
        A a2 = new A(1,9,"李四");
        A a3 = new A(2,10,"王五");
        A a4 = new A(3,10,"郑六");
        if(a1.compareTo(a2) > 0 ){
            System.out.println(a1.name + " 岁数大于 "+ a2.name);
        }
        if(a2.compareTo(a3) < 0){
            System.out.println(a2.name + " 岁数小于 "+ a3.name);
        }
        if(a3.compareTo(a4) == 0){
            System.out.println(a3.name +" 和 "+ a4.name+"岁数相等");
        }
    }

结果:
在这里插入图片描述
我们通过重写 Comparable 接口中的 compareTo() 方法,在 compareTo() 方法中我们将两个对象按照 age 去比较大小。

同样的,我们也可以按照 id 去比较,按照各种属性去比较。
那么我现在不仅要比较谁的id大,我还想知道谁的年龄大呢?
compareTo 方法只能重写一次啊,我们没有办法实现两个Comparable接口吧,也不能重写两个 compareTo() 方法。

Comparator

这时我们可以定义类实现Comparator接口重写compare()方法,就相当于定义了一个比较器

class AageCompartor implements Comparator<A>{
    @Override
    public int compare(A o1, A o2) {
        if(o1.age > o2.age){
            return 1;
        }
        else  if(o1.age == o2.age){
            return  0;
        }
        else return -1;
    }
}

class AidCompartor implements Comparator<A>{
    @Override
    public int compare(A o1, A o2) {
        if(o1.id > o2.id){
            return 1;
        }
        else  if(o1.id== o2.id){
            return  0;
        }
        else return -1;
    }
}

测试:

 public static void main(String[] args) {
        A a1 = new A(0,18,"张三");
        A a2 = new A(1,9,"李四");
        A a3 = new A(2,10,"王五");
        A a4 = new A(3,10,"郑六");

        AidCompartor aidCompartor  = new AidCompartor();
        AageCompartor aageCompartor = new AageCompartor();
        if(aidCompartor.compare(a1,a2) < 0 ){
            System.out.println(a1.name + " 的id小于 "+ a2.name);
        }
        if(aageCompartor.compare(a1,a2) > 0 ){
            System.out.println(a1.name + " 岁数大于 "+ a2.name);
        }

    }

结果:
在这里插入图片描述
如此一来,我们就可以实现很多对于A的比较器,当我们需要将进行某些属性的比较时,我们创建一个比较器对象,再调用compare()方法即可。

这就是比较器最基本的运用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值