2012-03-04 49 views
1

我有一個散列,將整數數組映射到一個整數。由於某些原因,哈希將一個鍵映射到多個值,如:爲什麼我的散列具有映射到多個值的相同鍵?

{[1,2]=>3, [1,2]=> 4} 

如何防止發生這種情況?運行

for key, value in map 
    puts key.inspect + "=>" + value.inspect + ":" + key.hash.inspect 
end 

給我

[1, 2]=>11:11 
[0, 4, 6, 8, 9]=>10:253 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]=>15:11189 
[0, 3, 4, 6, 7, 8, 9]=>13:981 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]=>14:11189 
[0, 1, 2, 4, 5, 6, 7, 8, 9]=>12:4661 
+1

它不應該是能夠創建多個密鑰是相同的哈希值。發佈你的代碼,或向我們展示如何創建該散列。 – 2012-03-04 02:50:54

+0

我正在努力獲得重現此方法。我在複製它時遇到了麻煩,因爲它發生在一些複雜的代碼中,而這不是我理解的東西。 – user1247626 2012-03-04 03:01:12

回答

5

我能想到的兩種情況。首先打開compare_by_identity。不知道該怎麼辦。不要打開它?將所有內容複製到正常的散列?

h={} 
h.compare_by_identity 
h[[1,2]]=2 
h[[1,2]]=3 
p h #=> {[1, 2]=>2, [1, 2]=>3} 

第二種情況更合理:密鑰在放入哈希後被修改。

h={} 
h[[1,2,3]]=2 
h[[1,2]]=3 
h.keys.first.pop # assuming ruby 1.9 
p h #=> {[1, 2]=>2, [1, 2]=>3} 

這很容易解決(但也很容易忘記):

h.rehash 
p h #=> {[1, 2]=>3} 
+0

第二種情況非常噁心。 – 2012-03-04 03:13:54

+0

尼斯發現第二個問題:)我建議只修改修改密鑰而不是'rehash'的代碼。 – 2012-03-04 03:14:11

+0

Rehashing似乎解決了這個問題,但是還有其他的問題,所以我只是要重寫這個方法。感謝您的幫助。 – user1247626 2012-03-04 03:40:53

相關問題