一、引子
在比較Java物件時,正常情況下,我們只能使用
==
或
!=
進行比較,而不能使用
>
或者
<
這樣的運算子。
那麼問題來了,開發過程中我們經常要對多個物件排序,排序必然需要比較,那麼
如何實現呢?
其實實現也很簡單,使用
Comparable或者Comparator
兩個介面中的一個即可。
二、Comparable介面的使用
先來看一段程式碼:
public static void main(String[] args) { String[] arr = new String[] {“dd”,“aa”,“xx”,“cc”}; Arrays。sort(arr); System。out。println(Arrays。toString(arr)); // 輸出[aa, cc, dd, xx] }
執行上面的程式碼,輸出結果為:
[aa, cc, dd, xx]
。
為什麼呢?查閱String類的原始碼可知,String類實現了Comparable介面的compareTo(obj)方法。
在重寫compareTo(obj)方法時,我們需要滿足
三個規則
:
如果當前物件this大於形參物件obj,則返回正整數,
如果當前物件this小於形參物件obj,則返回負整數,
如果當前物件this等於形參物件obj,則返回零。
那麼讓我們自定義的類實現比較就很簡單了,只需要按照上面三個規則實現Comparable介面中的compareTo(obj)方法,再呼叫Arrays。sort(arr)或者Collections。sort(list)即可。
那麼什麼情況下都能夠以實現Comparable介面的方式來定義物件的比較方式嗎?
當然不是!實際上,雖然Comparable介面可以解決一部分業務需求,但是
當我們無法使某個類實現Comparable介面時(比如第三方Jar包中的類),我們通常會使用另一種方式—實現Comparator介面。
三、Comparator介面的使用
與實現Comparable介面類似,使用Comparator介面同樣需要我們實現一個方法—compare(obj1,obj2)。
在重寫compare(Object o1,Object o2)方法時,我們同樣需要滿足
三個規則
:
如果方法返回正整數,則表示o1大於o2;
如果返回0,表示相等;
返回負整數,表示o1小於o2。
示例程式碼如下:
public static void main(String[] args) { Comparator comparator = (o1, o2) -> { if (o1 instanceof Person && o2 instanceof Person) { Person preson1 = (Person) o1; Person preson2 = (Person) o1; return Integer。compare(preson1。getAge(),preson2。getAge()); } throw new RuntimeException(“輸入的資料型別不一致”); }; Person p1 = new Person(); p1。setAge(18); Person p2 = new Person(); p2。setAge(20); Person[] people = new Person[]{p1, p2}; Arrays。sort(people,comparator); System。out。println(Arrays。toString(people)); // 輸出[Person{age=18}, Person{age=20}] }