Java 中 Comparable 和 Comparator 比较

1. 比较器介绍

为元素提供一种比较方式,元素可以依照此方式进行大小排序。
基本类型的包装类都实现了比较器,如果不满足jdk定义的比较方式,可自己实现一个外比较器,指定对象的比较规则。比较时,优先使用外比较器。

2. 内比较器:Comparable - compareTo方法

若一个类实现了Comparable接口,则该类支持排序。
通过a.compareTo(b)来比较a和b的大小。如果返回正数,则a>b;如果返回负数,则a<b;如果返回零,则a=b。

内比较器定义

public interface Comparable<T> {
    public int compareTo(T o);
}

实现Comparable接口,重写compareTo方法。

//内比较器
class People implements Comparable<People>{
    String name;
    int age;

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

    @Override
    public int compareTo(People o) {
        return age - o.age;
    }

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

3. 外比较器:Comparator - compare方法

如果需要控制某个类的次序,可以建立一个该类的比较器来进行排序。或者不满足现在的比较方式。

若一个类实现了Comparator接口,则它一定要实现compare(T o1,T o2)函数,可以不实现equals()函数,因为任何类都有默认的equals比较方法。
通过int compare(T o1,T o2)来比较o1和o2的大小。如果返回正数,则o1>o2;如果返回负数,则o1<o2;如果返回零,则o1=o2。

定义

public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}

定义一个类继承Comparator接口,实现compare方法。

//外比较器
class nameCom implements Comparator<People>{
    @Override
    public int compare(People o1, People o2) {
        return o1.name.compareTo(o2.name);
    }
}

调用外比较器的方法

//new一个外部器对象,将外比较器传值给treeMap
nameCom com = new nameCom();
TreeMap<People,String> treeMap = new TreeMap<>(com);

4. 使用场景

(1)外比较器使用场景:
如果要给对象提供多个比较原则时,可以使用外比较器;如果使用类的内部比较器不符合我们的需求,但我们没办法修改内部比价器,可以重新定义一个外比较器。

(2)内比较器使用场景:
创建类的时候,如果已经确定比较方式之后可以直接通过内比较器进行指定比价方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值