Comparable接口

                  Comparable接口

在前面我们学习了对数组的排序,使用的是Arrays.sort(T[] arr);

好,下面我们对对象数组进行排序:

声明一个Student类:在前面已经使用了。

测试类:

 

代码
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不相同,然后就再比较)如下:

代码
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;
}

 

 

 


 

 

 

 

 

 

 

 

 

posted @ 2010-12-22 13:59  meng72ndsc  阅读(1320)  评论(0编辑  收藏  举报