Java比較器
導入:Java中的對象,正常情況下,隻能進行比較:== 或 != 。不能使用 > 或 < 的
但是在開發場景中,我們需要對多個對象進行排序,言外之意,就需要比較對象的大小。
如何實作?使用兩個接口中的任何一個:Comparable 或 Comparator
Java實作對象排序的方式有兩種:
自然排序:java.lang.Comparable
定制排序:java.util.Comparator
自然排序:java.lang.Comparable
Comparable接口強行對實作它的每個類的對象進行整體排序。這種排序被稱為類的自然排序,實作 Comparable 的類
必須實作 compareTo(Object obj)
方法,兩個對象即 通過 compareTo(Object obj) 方法的傳回值來比較大小。如果目前對象this大 于形參對象obj,則傳回正整數,如果目前對象this小于形參對象obj,則傳回 負整數,如果目前對象this等于形參對象obj,則傳回零。
- String:按照字元串中字元的Unicode值進行比較
- Character:按照字元的Unicode值來進行比較
- 數值類型對應的包裝類以及BigInteger、BigDecimal:按照它們對應的數值 大小進行比較
- Boolean:true 對應的包裝類執行個體大于 false 對應的包裝類執行個體
- Date、Time等:後面的日期時間比前面的日期時間
1.像String、包裝類等實作了Comparable接口,重寫了compareTo(obj)方法,給出了比較兩個對象大小的方式。
2.像String、包裝類重寫compareTo()方法以後,進行了從小到大的排列
String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
//[AA, CC, DD, GG, JJ, KK, MM]
-
重寫compareTo(obj)的規則:
如果目前對象this大于形參對象obj,則傳回正整數,
如果目前對象this小于形參對象obj,則傳回負整數,
如果目前對象this等于形參對象obj,則傳回零。
-
對于自定義類來說,如果需要排序,我們可以讓自定義類實作Comparable接口,重寫compareTo(obj)方法。
在compareTo(obj)方法中指明如何排序
@Override
public int compareTo(Object o) {
// System.out.println("**************");
if(o instanceof Goods){
Goods goods = (Goods)o;
//方式一:
if(this.price > goods.price){
return 1;
}else if(this.price < goods.price){
return -1;
}else{
// return 0;
return -this.name.compareTo(goods.name);
}
//方式二:
// return Double.compare(this.price,goods.price);
}
// return 0;
throw new RuntimeException("傳入的資料類型不一緻!");
}
定制排序:java.util.Comparator
1.背景:
當元素的類型沒有實作java.lang.Comparable接口而又不友善修改代碼,或者實作了java.lang.Comparable接口的排序規則不适合目前的操作,那麼可以考慮使用 Comparator 的對象來排序
2.重寫
compare(Object o1,Object o2)
方法,比較o1和o2的大小:如果方法傳回正整數,則表示o1大于o2;如果傳回0,表示相等;傳回負整數,表示o1小于o2。
public void test3(){
String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};
Arrays.sort(arr,new Comparator(){
//按照字元串從大到小的順序排列
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof String && o2 instanceof String){
String s1 = (String) o1;
String s2 = (String) o2;
return -s1.compareTo(s2);
}
// return 0;
throw new RuntimeException("輸入的資料類型不一緻");
}
});
System.out.println(Arrays.toString(arr));
}
兩種排序方式的對比:
Comparable接口的方式一旦确定,保證Comparable接口實作類的對象在任何位置都可以比較大小。
Comparator接口屬于臨時性的比較。