天天看點

java比較器(總結與尚矽谷java)

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]
           
  1. 重寫compareTo(obj)的規則:

    如果目前對象this大于形參對象obj,則傳回正整數,

    如果目前對象this小于形參對象obj,則傳回負整數,

    如果目前對象this等于形參對象obj,則傳回零。

  2. 對于自定義類來說,如果需要排序,我們可以讓自定義類實作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接口屬于臨時性的比較。