Comparable和Comparator

简介

Comparable和Comparator都是比较器,实现两个对象的比较,但又有些不同。

  • 要比较对象的类实现Comparable接口,覆盖compareTo(T o)方法,是对象类自带的比较器。
  • 单独写一个比较类实现Comparator接口,覆盖compare(T o1, T o2)方法,是用户根据自定义的比较规则写的比较器。

举个例子

有一个Person类,属性有身高、年龄,自带一个比较器,先根据身高排序,再根据年龄排序。

public class Person implements Comparable<Person>{
    private int height;
    private int age;
    
    public Person(int height, int age) {
        this.height = height;
        this.age = age;
    }

    @Override
    public int compareTo(Person o) {
        //先比较身高
        if(height != o.height){
            return height - o.height;
        }
        //再比较年龄
        if(age != o.age){
            return age - o.age;
        }
        return 0;
    }
    
     @Override
    public String toString() {
        return "Person{" +
                "height=" + height +
                ", age=" + age +
                '}';
    }
}

然而,我想改变下比较规则,先比较年龄,再比较身高,由于我不能改变Person类的源码,所以我不能改写compareTo(Person o)方法,这时候,我们可以单独写一个Person类的比较器,它实现Comparator接口。

public class PersonComparator implements Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        //先比较年龄
        if(o1.age != o2.age){
            return o1.age - o2.age;
        }
        //再比较身高
        if(o1.height != o2.height){
            return o1.height - o2.height;
        }
        return 0;
    }
}

使用

 public static void main(String[] args){
        Person p1 = new Person(1, 1);
        Person p2 = new Person(2,1);
        Person p3 = new Person(2, 0);
        Person[] people = {p1, p2, p3};
        Arrays.sort(people, new PersonComparator());
        System.out.println(Arrays.toString(people));
 }

先按年龄排序,再按身高排序,结果如下:

[Person{height=2, age=0}, Person{height=1, age=1}, Person{height=2, age=1}]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值