在java中,同一個類的實例之間經常需要進行比較。如果有兩個employee對象,你很可能需要知道他們之中哪一位在這家公司待的更久一些,或者希望按年齡升序或者降序排列之後再顯示搜索結果。通過實現java.lang.Comparable和java.uti.Comparator接口,可以使對象具有可比較性。
一、使用java.lang.Comparable
實現了java.lang.Comparable接口,就必須重寫它的抽象方法compareTo()
public int compareTo(T o);
@Override
public int compareTo(Person o) {
if (this.age > o.age) {
return 1;
} else if (this.age < o.age) {
return -1;
}
return 0;
}
這樣這個對象就具備了比較性,並且使用java.util.Arrays的靜態方法sort可以對任意對象數組進行排序。compareTo方法中的參數o是指這個對象進行比較的對象。如果這個對象大於參數對象,這個方法在實現類中的代碼就必須返回一個正值;如果這個對象小於參數對象,則返回一個負值。默認這個規則是升序的,若想降序,則可以使正負值相調換即可。
二、實現java.lang.Comparator
實現java.lang.Comparable使你能夠定義一種對類的實例進行比較的方法。然而,對象有的時候可以通過多種方式進行比較。例如,倆個Person對象可能需要按照年齡或者姓名比較,這時使用第一種方式就不行了,因爲第一種方式只能在類中定義一種比較。爲了使對象具有倆種比較方式,這就需要實現java.lang.Comparator接口,定義兩個比較器來進行比較。重寫抽象方法compare
int compare(T o1, T o2);
@Override
public int compare(Person o1, Person o2) {
if (o1.getAge() > o2.getAge()) {
return 1;
} else if (o1.getAge() < o2.getAge()) {
return -1;
}
return 0;
}
另外再依照這個比較器重寫一個按姓名比較的比較器,此處偷懶!
集合排序或者是數組排序都有傳入比較器進行比較或者排序的方法。下圖是Collections和Arrays的帶有比較器的排序方法
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
public static <T> void sort(T[] a, Comparator<? super T> c)
三、總結
兩種方法各有優劣, 用Comparable 簡單, 只要實現Comparable 接口的對象直接就成爲一個可以比較的對象,但是需要修改源代碼,。用Comparator 的好處是不需要修改源代碼, 而是另外實現一個比較器, 當某個自定義的對象需要作比較的時候,把比較器和對象一起傳遞過去就可以比大小了, 並且在Comparator 裏面用戶可以自己實現複雜的可以通用的邏輯,使其可以匹配一些比較簡單的對象,那樣就可以節省很多重複勞動了。