1. 程式人生 > 其它 >java中物件陣列排序(java比較器,Comparable 或 Comparator)

java中物件陣列排序(java比較器,Comparable 或 Comparator)

技術標籤:java高階程式設計師必須會介面java

Java比較器

java 中的物件,正常情況下,只能進行比較:== 或 != 。不能用 > 或 < 的。但是在開發場景中,我們需要對多個物件進行排序,言外之意,就需要比較物件的大小。如何實現?使用現在連個介面中的任何一個:ComparableComparator

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
    { private String name; private double price; public Goods() { } public Goods(String name, double price) { this.name = name; this.price = price; } @Override public String toString() { return "Goods{" + "name='"
    + name + '\'' + ", price=" + price + '}'; } 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)); } // 排序方式 @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 -this.name.compareTo(((Goods) o).name);// 價格相同,按照名稱字母順序從小到大排序。 } // 從大到小 // if (this.price > goods.price) { // return -1; // } else if (this.price < goods.price) { // return 1; // } else { // return this.name.compareTo(((Goods) o).name);// 價格相同,按照名稱字母順序從小到大排序。 // } // 方式二 //return Double.compare(this.price, goods.price); } else { // 不是商品類物件,丟擲一個異常 throw new RuntimeException("傳入的資料不一致"); } } }
  • 輸出

    • [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) 方法, 比較 o1o2 的大小:
    • 如果方法返回正整數,則表示 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}]