2009-12-28 68 views
3

我有幾個存儲同一類的對象的集合,但我想爲它們中的每一個指定一個不同的標識函數(也就是說,在一個集合中,如果Ax = B == Bx,而在另一個A == B如果Ay == By)。爲同一個對象定義多元哈希函數

目前我使用TreeSets爲每個定義不同的比較器。我想知道如果我想切換到HashSets可以做同樣的事情。 Java不允許以與允許比較器進行排序/基於樹的集合相同的方式傳遞單獨的散列函數。我能想到的唯一方法就是創建一個不同的包裝類,併爲每個HashSet的元素實現hashCode()方法。有沒有更好的方法來做到這一點?

回答

2

您可以嘗試使用THashSet GNU Trove,這支持多種哈希策略。

7

如何爲每組創建單獨的子類。每個子類的唯一區別是符合條件的重寫哈希函數。

+3

您可以將子類實現爲私有內部類,並提供工廠方法來獲取所需的相等語義。這封裝完全選擇 – Andrew 2009-12-28 15:43:36

3

我不知道有更好的方法來做到這一點。您提出的解決方案(包含不同比較邏輯的包裝類)聽起來非常合理。

您提到實施hashCode方法 - 不要忘記實施equals以及。

2

還有另一種選擇:你可以複製源HashMap和用別的東西代替的方法hash(Object key)(例如,一個Hasher的作品像TreeMapComparator通話)。

+0

好。只記得實現Collection接口。 – Bozho 2009-12-28 15:31:29

+0

謝謝。我想這是最好的事情。我接受Peter Lawry的回答,因爲他建議使用現成的實現,而不是自己編寫代碼。 – MAK 2009-12-28 20:06:37