2012-03-14 67 views
2

我有一個對象的ArrayList(POJO)有一個Id和另一個字段。我已經在Id字段的POJO中實現了equals()/ hashcode()覆蓋。當我使用Object類的equals()方法比較兩個對象時,它工作得很好。然而,當我將這些對象添加到數組列表中並實現時,它給了我一個classCastexception。我擡頭看,發現我需要實現一個比較器。這個比較器也可以做一些等於/ hashcode覆蓋。如果是這樣那麼爲什麼上面的代碼不起作用?(我知道沒有比較器,但是我的問題是不可能基於對象的哈希碼實現排序嗎?)使用哈希代碼排序對象的ArrayList

+0

你絕對希望實現Comparable接口。 'compareTo()'方法實際上決定了事物是「大於」還是「小於」另一件事。 'equals()'方法只能說明是否某個東西是「相等的」,這對於排序沒有多大作用。 – gnomed 2012-03-14 15:20:37

回答

5

正如消息所述,您的對象需要實現Comparable接口才能排序。或者,您可以爲您的sort()方法提供比較器。例如,假設你的對象是字符串,要基於哈希碼進行排序,你可以這樣做:

public static void main(String[] args) { 
    List<String> list = Arrays.asList("string", "sdkj"); 
    for (String s : list) { 
     System.out.println(s + "=" + s.hashCode()); 
    } 
    Collections.sort(list, new Comparator<String>() { 

     @Override 
     public int compare(String o1, String o2) { 
      return o1.hashCode() - o2.hashCode(); 
     } 
    }); 
    System.out.println("After Sorting"); 
    for (String s : list) { 
     System.out.println(s + "=" + s.hashCode()); 
    } 
} 
0

比較器確實沒有做任何事情來平等或散列碼,它使用等號或散列碼來確定它返回。它是Collections.sort方法的文檔的一部分。看看 Comparable接口並在你的課堂上實現它。舉個例子,你可以看看SO問題java class implements comparable

0

實現基於哈希代碼排序當然是可能的,但可能不會持續地產生期望的行爲。例如,考慮一個類Foo,其hashCode()方法被定義爲始終返回一個常數值。例如:

public int hashCode() { 
    return 1; 
} 

鑑於與使用該方法的限定比較器串聯此hashCode方法,列表幾乎肯定不正確排序,除非瑣碎例(空列表,單個元件列表等)。

一般來說,需要記住的一件好事就是在java.lang.Object.hashCode java文檔中記錄的hashCode-equals約定。簡而言之,hashCode碰撞可能導致不相等的對象,這些方法定義的渲染排序無效。