一、介紹
在java中接口comparable使我們經常要接觸到的,比如對集合或者數組進行排序,我們經常使用到Arrays.sort()或者Collections.sort().當集合中的對象是自定義的對象時,我們有兩種方法能夠使排序方法應用到自定義對象的集合(數組)中。下面我們介紹Comparable的用法。二、java庫提供的對象的排序
下面是List中對Integer對象的排序public class MainClass {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
Random rd = new Random();
for(int i=0;i<10;i++)
list.add(rd.nextInt(100));
for(int i:list)
System.out.print(i+" ");
Collections.sort(list);
System.out.println("");
for(int i:list)
System.out.print(i+" ");
}
}
這很簡單,結果如下:
我們通過Integer的源碼可以看出Integer類繼承了Comparable接口
並且重寫了compareTo,這也是Comparable中唯一的方法。
三、自定義對象的排序
自定義對象同樣需要繼承Comparable接口,並重寫compareTo方法,這里我們舉一個比較學生成績的Student類,如下:class Student implements Comparable<Student>{
int sno;
int score;
Student(int sno,int score){
this.sno = sno;
this.score = score;
}
@Override
public int compareTo(Student o) {
if(this.score<o.score) return -1;
else if(this.score>o.score) return 1;
else return 0;
}
}
我們設本對象為A,比較的對象為B,用於比較的屬性為x。在compareTo方法中,若A.x<B.x則返回-1,若A.x>B.x則返回1,相等的返回0。這里我們建議如果A.compareTo(B)==0,那么為了保證一致性A.equals(B)中最好也要為真(但這並不強制),可以根據實際情況決定是否重寫equals(同樣還有hashcode方法),這樣在set或者map類型的集合中需葯保證compareTo和equals的一致性。
執行的結果如下:
如果上面例子中的Student不繼承成Comparable接口,程序會報錯,編譯通不過。這里我們需要注意一點的是只有繼承了Comparable接口並重寫了compareTo方法,這個類才視為Compareable類,如果值寫了compareTo方法,沒有明確implement Comparable則其只是一個普通的類