2011-04-27 87 views
1

我有自定義對象的ArrayList。我需要按不同的參數進行排序,即年份和價格都是上升和下降。什麼是最好的方式來做到這一點?我想過在實例化比較器期間實現Comparator並將排序模式傳遞給構造函數。這是個好主意嗎?Java比較自定義對象

回答

2

我建議每個排序類型使用不同的Comparator實現。在Java SE 8(!)中,匿名內部類,枚舉和lambda表達式是實現Comparator和其他無狀態函數類對象的好方法。

您可以用Collections.reverseOrder反轉。

2

是的。自定義Comparator是一個很好的方法。

正如@Tom和@Puce所提到的那樣,您可以在Comparator上實時運行reverse the order

+2

每種排序類型都有一個自定義的「比較器」,但是與「Collections.reverseOrder」相反:http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#reverseOrder(java .util.Comparator) – 2011-04-27 17:00:47

0

規範的答案是實現兩個比較器 - 一個按升序排序,另一個按降序排列。

+3

使用Collections.reverseOrder – Puce 2011-04-27 17:01:32

+0

@Puce - 好點。 – CPerkins 2011-04-27 17:20:30

2

這是一種方式。但是,如果它是一種默認方式,它確實是有意義的。考慮以下客戶類。通常,您總是按名稱對客戶進行排序。但有時候,你想按他們的信用額度來排序。

爲了方便起見,實施Comparable是有意義的。至少,您可以將比較器公開爲課程的最終組件,以便用戶可以輕鬆訪問它們,並且您可以相信它們是由課程作者編寫的(或者至少是熟悉該課程的人員)。 )

class Customer implements Comparable<Customer> { 

    public final Comparator<Customer> byCreditLimit = new Comparator<Customer>() { 
     public int compare(Customer c1, Customer c2) { 
      return c1.creditLimit.compareTo(c2.creditLimit); 
     } 
     public boolean equals(Object o) { 
      return o == this; 
     } 
    } 

    private String name; 
    private BigDecimal creditLimit; 

    public Customer(String name, BigDecimal creditLimit) { 
     this.name = name; 
     this.creditLimit = creditLimit; 
    } 

    public boolean equals(Object o) { 
     if(o instanceof Customer) { 
      Customer c = Customer(o); 
      return name.equals(c.name); 
     } 
     return false; 
    } 

    public int hashCode() { 
     return name.hashCode(); 
    } 

    public int compareTo(Customer c) { 
     return name.compareTo(c.name); 
    } 
} 
+0

你能說出爲什麼Comparable比Comparator更好嗎? – 2011-04-27 17:08:20

+2

主要是爲了方便。這是一種說法:「大多數情況下,你會對這種類型的對象進行排序,你應該像這樣排序。」這只是一件少想的事情。想象一下,你是一個開發人員使用一個類。您希望將對象分類以加快查找速度。開發人員知道,通過對名稱進行排序,您應該可以獲得相對較好的分配,而按信用額度排序的效率會更低(批次可能具有相同的信用額度,但等於說明Set最多隻有一個給定名稱)。通過使用Comparable,作者可以提供默認比較機制。 – corsiKa 2011-04-27 17:16:27

+1

如果一個類實現了Comparable,它表明它具有「自然順序」。好的樣品是例如數字類(Integer,Long),它們按包裝的數字排序。如果沒有「自然順序」,或者你想要的東西與「自然順序」不同 - >使用比較器 – Puce 2011-04-27 17:31:38