java中物件陣列排序(java比較器,Comparable 或 Comparator)
阿新 • • 發佈:2021-01-19
Java比較器
java 中的物件,正常情況下,只能進行比較:== 或 != 。不能用 > 或 < 的。但是在開發場景中,我們需要對多個物件進行排序,言外之意,就需要比較物件的大小。如何實現?使用現在連個介面中的任何一個:Comparable 或 Comparator。
Comparable介面
**位於:**java.lang.Comparable
- 使用舉例
- 像 String, 包裝類 等實現了Comparable 介面,重寫了 compareTo() 方法,給出了兩個物件比較大小的方式**(預設從小到達排列**)。
- 重寫 compareTo()
- 如果當前物件 this 大於形參物件obj,則返回正整數。
- 如果當前物件 this 小於形參物件obj,則返回負數。
- 如果當前物件 this 等於形參物件obj,則返回零。
- 對於自定義類來說,如果需要排序,我們可以讓自定義類實現 Comparable 介面,重接 compareTo(obj) 方法,並在 comparaTo(obj) 方法中指明如何排序。
測試
-
構建一個商品類,然後建立陣列,讓商品按照價格從小到大排序,如果價格相同,則按照名稱從小到大排序
-
import java.util.Arrays; public class Goods implements Comparable
-
輸出
-
[Goods{name='vivo', price=12.0}, Goods{name='xiaomi', price=24.0}, Goods{name='huawei', price=24.0}, Goods{name='open', price=31.0}, Goods{name='leno', price=343.0}]
-
Comparator介面
位於:java.util.Comparator
定製排序
- 當元素的型別沒有實現 java.lang.Comparable介面,而且又不方便修改程式碼,或者實現了,java.lang.Comparable介面的順序規則不適合當前的操作,那麼可以考慮使用 Comparator 的物件來排序, 強行對多個物件整體排序的比較。
- 重寫 compare(Object o1, Object o2) 方法, 比較 o1 和 o2 的大小:
- 如果方法返回正整數,則表示 o1 大於 o2 ;
- 如果方法返回負整數, 則表示 o1 小於 o2;
- 如果返回零,則表示 o1 等於 o2;
- 可以將Comparator傳遞給sort方法,(如Collections.sort和Arrays.sort),從而允許在排序順序上實現精準控制。
- 還可以使用Compartor來控制某些資料結構(如有序set或有序對映)的順序,或者為那些沒有自然順序的物件 collection 提供排序。
public static void main(String[] args) {
Goods[] arr = new Goods[5];
arr[0] = new Goods("leno", 343);
arr[1] = new Goods("vivo", 12);
arr[2] = new Goods("open", 31);
arr[3] = new Goods("huawei", 24);
arr[4] = new Goods("xiaomi", 24);
// 從小到大排序
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
// 從大到小排序,定製排序
Arrays.sort(arr, new Comparator<Goods>() {
@Override
public int compare(Goods o1, Goods o2) {
if (o1.price > o2.price) {
return -1;
} else if (o1.price < o2.price) {
return 1;
} else {
return o1.name.compareTo(o2.name); // 按名稱從大到小
}
}
});
}
輸出
[Goods{name='vivo', price=12.0}, Goods{name='xiaomi', price=24.0}, Goods{name='huawei', price=24.0}, Goods{name='open', price=31.0}, Goods{name='leno', price=343.0}]
[Goods{name='leno', price=343.0}, Goods{name='open', price=31.0}, Goods{name='huawei', price=24.0}, Goods{name='xiaomi', price=24.0}, Goods{name='vivo', price=12.0}]