2012-06-13 93 views
1

我想要做的事很簡單,我想合併兩張地圖。 說在java中合併地圖

map1={(1,"one"),(2,"two"),(3,"three"); 
map2={(1,"onetoo"),(4,"four")}; 

如果我遵循這個 - >

map3.putall(map1); 
map3.putall(map2); 

然後值爲1是onetoo但是當我遵循扭轉它是一個。 有無論如何我可以改變它?我的意思是說,java覆蓋並只放置一個鍵的最新值。 即,如果onetoo在一個之後(在它們各自的地圖中)被添加,則無論putall對map3的調用順序如何,該值仍然存在。

+2

你能舉一個你想要它創建的地圖的例子嗎? –

+1

合併後你期望什麼? – hcg

+0

你應該創建一個示例來展示你的意思。但是我認爲如果你想達到這個目的,你必須創建你自己的'TimedMap extends Map',或者通過使用相應的Element來保存每個'put'的時間戳並通過迭代你的地圖來進行合併只有添加該元素時,如果沒有該項的條目和較低的時間戳記在相應的元素上。 – brimborium

回答

7

沒有辦法做到這一點,除非您存儲添加值時的實際時間。

map1={(1,("one", 15:15)), (2, ("two", 15:16))}

然後你就可以添加所有MAP1,然後遍歷MAP2增加只有在密鑰已不存在,或者如果它的存在,但與較早時間戳。

+1

爲好主意+1! – alfasin

+0

我要去嘗試這個。關注迭代開銷,但因爲沒有出路將使用此..感謝您的幫助 – BlahBlah

1

這就是地圖的工作方式,他們使用您設置的對象的哈希碼作爲在地圖條目中識別自身的關鍵,並且您可以看到它必須是唯一的。

所以你必須指定另一個關鍵,因爲1的整數值具有的哈希碼1

0

好吧,如果你的PROGRAME擔任你想要的,然後預測以下

map3.get(1); 
的輸出

你永遠無法知道它是「One」還是「Onetoo」。

爲防止出現此類問題,Java中的Maps被設計爲只包含唯一鍵。

所以,如果你寫

map3.putall(map1); 

1的值是 「一」。但只要你寫了

map3.putall(map2); 

1的值被重置,它變成「onetoo」。反向時會發生逆轉。可能的解決方案是。

  1. 把你的鑰匙放在地圖上,使他們(鑰匙)唯一標識一個物體。因此,無論將來何時合併地圖,密鑰中都不會發生衝突(根據重複性)。

  2. 如果你不能做到這一點,那麼一個可能的解決方案可能是獲取每個地圖的所有密鑰,並檢查重複性並更改重複密鑰,以便您可以無障礙地檢索對象。

+0

字的智者:該方法是大寫爲putAll,而不是putall:https:// docs.oracle.com/javase/7/docs/api/java/util/Map.html#putAll(java.util.Map) –