Java物件集合、物件陣列如何排序?你需要知道這兩種方式

一、引子

在比較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)方法。

Java物件集合、物件陣列如何排序?你需要知道這兩種方式

在重寫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}] }