Comparable接口
Comparable接口
在前面我们学习了对数组的排序,使用的是Arrays.sort(T[] arr);
好,下面我们对对象数组进行排序:
声明一个Student类:在前面已经使用了。
测试类:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class SortTest {
public static void main(String[] args) {
Student[] s = new Student[] {new Student("zhangsan",1),
new Student("lisi",2),
new Student("wangwu",3)};
Arrays.sort(s);
}
}
运行时出现了异常:
错误分析:public interface Comparable<T>此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。所以重写的compareTo 在调用Arrays.sort()方法时调用了。
修改如下:
class Student implements Comparable{
// ... ...
public int compareTo(Object o) {
Student ss = (Student)o;
return age>ss.age? 1 : (age == ss.age? 0 : -1);
}
}
如果使用了泛型,你还可以这样:
class Student implements Comparable<Student> {
// ... ...
public int compareTo(Student o) {
return age > o.age ? 1 : (age == o.age ? 0 : -1);
}
}
之所以能够对Integer类型和String类型的数组进行排序,是因为它们都实现了Comparable接口,并且重写了那个该死的方法。因此,只要是我们自己声明的类,如果你想要对它里面的元素进行排序,那么你必须实现该接口,并且覆盖那个该死的方法。
public final class String
extends Object
implements Serializable, Comparable<String>, CharSequence
public final class Integer
extends Number
implements Comparable<Integer>
假设age不能唯一标识呢?那么再结合name吧!(也就是说age相同了,而name不相同,然后就再比较)如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public int compareTo(Student o) {
int result = age > o.age ? 1 : (age == o.age ? 0 : -1);
if(0 == result) {
result = name.compareTo(o.name);// 直接利用String类的compareTo进行排序,因为String实现了Comparable接口。
}
return result;
}