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()方法即可。
这就是比较器最基本的运用。