2012-07-08 28 views
1

這裏的時候是我的課:執行比較,但有例外,調用Arrays.sort

public static class __9_7_Person implements Comparator<__9_7_Person> { 
    private int height; 
    private int weight; 
    public __9_7_Person(int height, int weight) { 
     this.height = height; 
     this.weight = weight; 
    } 
    public int compare(__9_7_Person p1, __9_7_Person p2) { 
     if (p1.height != p2.height) { 
      return p1.height - p2.height; 
     } 
     else { 
      return p1.weight - p2.weight; 
     } 
    } 
} 

我然後創建一個這樣的數組:

__9_7_Person p[] = {new __9_7_Person(60, 100), 
        new __9_7_Person(70, 150), 
        new __9_7_Person(56, 90), 
        new __9_7_Person(75, 190), 
        new __9_7_Person(60, 95), 
        new __9_7_Person(68, 110), 
}; 

但有例外,當我打電話Arrays.sort( p):「線程中的異常」main「java.lang.ClassCastException:ch_9 $ __ 9_7_Person不能轉換爲java.lang.Comparable」

+4

我希望這些不是你的類的實際名稱,下劃線和所有... – 2012-07-08 18:45:37

回答

4

您應該實現Comparable自然排序,在這種情況下,你不需要一個分離器比較傳遞到Arrays.sort或者你可以實現Comparator<__9_7_Person>(可能在一個單獨的類,如HeightWeightPersonComparator)和撥打:

Arrays.sort(p, new HeightWeightPersonComparator()); 

瞭解ComparableComparator之間的區別是很重要的。 A Comparable的實現說「我知道如何將自己與另一個適當類型的對象進行比較」 - 其中Comparator實現說「我知道如何比較兩個適當類型的對象」。

很明顯,任何類型只能執行一次(在合理範圍內)Comparable,而可以有任何數量的Comparator實現。使用單獨的Comparator比較靈活,除非您應該使用「明顯」的比較。如果您未指定ComparatorArrays.sort將假定陣列中的每個元素都可以將其自身與陣列的其他元素進行比較,即它們實現了Comparable

8

您實現了比較器,不是Comparable。您應該實現Comparable而不是Comparator。

如上所述in the docs

陣列中的所有元素都必須實現Comparable接口。

比較器是有用的,如果你想能夠有不同的排序順序爲同一類。在這種情況下,可比不能使用

+1

+1,添加了指定該需求的'Arrays.sort'的引用。 – eran 2012-07-08 18:46:52

0

您需要實現java.lang.Comparable接口,而不是java.util.Comparator接口。