Java中的比較器
阿新 • • 發佈:2021-08-11
比較器
Comparable介面
自然排序
-
像String、包裝類等實現了Comparable介面,重寫了compareTo(obj)方法,給出了比較兩個物件大小的方式。
-
像String、包裝類重寫compareTo()方法以後,進行了從小到大的排列
String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"}; // Arrays.sort(arr);
-
重寫compareTo(obj)的規則:
- 如果當前物件this大於形參物件obj,則返回正整數,
- 如果當前物件this小於形參物件obj,則返回負整數,
- 如果當前物件this等於形參物件obj,則返回零。
-
對於自定義類來說,如果需要排序,我們可以讓自定義類實現Comparable介面,重寫compareTo(obj)方法。在compareTo(obj)方法中指明如何排序
public class Goods implements Comparable{ private String name; private double price; //按價格從低到高排序 @Override public int compareTo(Object o) { 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 Double.compare(this.price, goods.price); } throw new RuntimeException("傳入的資料型別不一致"); } }
Comparator介面
定製排序
當元素的型別沒有實現java.lang.Comparable介面而又不方便修改程式碼,或者實現了java.lang.Comparable介面的排序規則不適合當前的操作,那麼可以考慮使用 Comparator 的物件來排序
重寫compare(Object o1,Object o2)方法,比較o1和o2的大小:
如果方法返回正整數,則表示o1大於o2;
如果返回0,表示相等;
返回負整數,表示o1小於o2。
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("輸入的資料型別不一致"); } });
Arrays.sort(arr, new Comparator() {
//指明商品比較大小的方式:按照產品名稱從低到高排序,再按照價格從高到低排序
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Goods && o2 instanceof Goods){
Goods g1 = (Goods)o1;
Goods g2 = (Goods)o2;
if(g1.getName().equals(g2.getName())){
return -Double.compare(g1.getPrice(),g2.getPrice());
}else{
return g1.getName().compareTo(g2.getName());
}
}
throw new RuntimeException("輸入的資料型別不一致");
}
});
區別
Comparable介面的方式一旦指定,保證Comparable介面實現類的物件在任何位置都可以比較大小。
Comparator介面屬於臨時性的比較。