【问题标题】:Merge maps in java在java中合并地图
【发布时间】:2012-06-16 03:30:07
【问题描述】:

我想做的很简单。我想合并两张地图。 说

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

如果我遵循这个->

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

那么 1 的值也是一个,但是当我反向操作时它是一个。 无论如何我可以改变它吗?我的意思是java覆盖并只放置一个键的最新值。 即如果 onetoo 是在一个之后添加的(在他们各自的地图中),那么无论 putall 调用 map3 的顺序如何,该值仍然是 one。

【问题讨论】:

  • 你能举一个你想要它创建的地图的例子吗?
  • 合并后有什么期待?
  • 您绝对应该创建一个示例来说明您的意思。但我认为,如果你想实现这一点,你将不得不创建自己的TimedMap extends Map,或者通过使用相应的元素保存每个put 的时间戳来手动完成,并通过迭代你的地图进行合并,只添加元素,如果没有具有该键的条目并且相应元素上的时间戳较低。

标签: java merge maps


【解决方案1】:

好吧,如果你的程序如你所愿,那么预测以下的输出

 map3.get(1);

你永远无法知道它是“One”还是“Onetoo”。

为了防止任何此类问题,Java 中的地图被设计为仅包含唯一键。

所以,如果你写

map3.putall(map1);

1 的值为“一”。但是一旦你写了

map3.putall(map2);

1 的值被重置并变为“onetoo”。反转时会发生反转。可能的解决方案是。

  1. 将您的键放入映射中,以便它们(键)唯一标识一个对象。这样以后无论何时合并地图,键中都不会发生冲突(就重复性而言)。

  2. 如果您不能这样做,那么可能的解决方案是获取每个映射的所有键并检查重复性并更改重复键,以便您可以轻松检索对象。

【讨论】:

【解决方案2】:

没有办法做到这一点,除非您存储添加值的实际时间。

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

然后您可以添加所有 map1,然后迭代 map2,仅当键不存在或存在但时间戳更早时才添加。

【讨论】:

  • 我要去试试这个。担心迭代开销但由于没有出路将使用这个..感谢您的帮助
【解决方案3】:

这就是映射的工作方式,它们使用您设置为键的对象的哈希码作为在映射条目中识别其自身的一种方式,并且您可以看到它必须是唯一的。

因此您必须指定另一个键,因为整数值 1 的哈希码为 1。

【讨论】:

    猜你喜欢
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2018-10-23
    • 1970-01-01
    相关资源
    最近更新 更多