2012-06-13 156 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) –