我有一個對象的ArrayList(POJO)有一個Id和另一個字段。我已經在Id字段的POJO中實現了equals()/ hashcode()覆蓋。當我使用Object類的equals()方法比較兩個對象時,它工作得很好。然而,當我將這些對象添加到數組列表中並實現時,它給了我一個classCastexception。我擡頭看,發現我需要實現一個比較器。這個比較器也可以做一些等於/ hashcode覆蓋。如果是這樣那麼爲什麼上面的代碼不起作用?(我知道沒有比較器,但是我的問題是不可能基於對象的哈希碼實現排序嗎?)使用哈希代碼排序對象的ArrayList
2
A
回答
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碰撞可能導致不相等的對象,這些方法定義的渲染排序無效。
相關問題
- 1. 生成對象的哈希代碼
- 2. 添加對象的ArrayList [哈希合併]
- 3. 使用其哈希碼引用對象?
- 4. 排序哈希
- 5. 排序哈希
- 6. 對象的ArrayList與哈希映射的Arraylist
- 7. 嵌套哈希排序哈希鍵
- 8. 排序ArrayList的對象
- 9. 用opencl排序哈希
- 10. Python哈希函數和哈希對象
- 11. Ruby 1.8.7使用JSON排序哈希.parse
- 12. Ruby哈希 - 如何在填充對象時使用哈希值?
- 13. 排序的哈希集合
- 14. 使用插入排序對象的arraylist排序
- 15. ArrayList對象排序混淆
- 16. 對數組排序參考哈希
- 17. 排序與哈希映射關聯的模型ArrayList
- 18. 具有相同哈希碼的兩個不同對象的確定性排序
- 19. Java迭代哈希表vs ArrayList速度
- 20. 使用`eqv`對象哈希查找
- 21. Rails的對象哈希
- 22. 在對象集合中遞增遞增的哈希代碼
- 23. 仍然在可變對象的哈希代碼
- 24. C#中的哈希表ArrayList#
- 25. 排序字典哈希
- 26. 哈希圖排序java
- 27. 下降哈希值排序
- 28. 哈希值重新排序
- 29. 選擇用對象ArrayList排序
- 30. 在javascript中使用sortBy對哈希值進行排序
你絕對希望實現Comparable接口。 'compareTo()'方法實際上決定了事物是「大於」還是「小於」另一件事。 'equals()'方法只能說明是否某個東西是「相等的」,這對於排序沒有多大作用。 – gnomed 2012-03-14 15:20:37