简介
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}]