1. 程式人生 > 其它 >Java中的比較器

Java中的比較器

比較器

Comparable介面

自然排序

  1. 像String、包裝類等實現了Comparable介面,重寫了compareTo(obj)方法,給出了比較兩個物件大小的方式。

  2. 像String、包裝類重寫compareTo()方法以後,進行了從小到大的排列

            String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};
            //
            Arrays.sort(arr);
    
  3. 重寫compareTo(obj)的規則:

    1. 如果當前物件this大於形參物件obj,則返回正整數,
    2. 如果當前物件this小於形參物件obj,則返回負整數,
    3. 如果當前物件this等於形參物件obj,則返回零。
  4. 對於自定義類來說,如果需要排序,我們可以讓自定義類實現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介面屬於臨時性的比較。