如何将Java hashMap 上的所有内容一一替换为另一内容,但不替换现有的键和值?
我需要将一个 A HashMap 中的所有键和值复制到另一个 B 上,但不替换现有的键和值。
最好的方法是什么?
我在想,而不是迭代 keySet 并检查它是否存在,我会
Map temp = new HashMap(); // generic later
temp.putAll(Amap);
A.clear();
A.putAll(Bmap);
A.putAll(temp);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
看来您愿意创建一个临时
Map
,所以我会这样做:这里,
patch
是您要添加到的地图目标地图。
感谢 Louis Wasserman,这是一个利用 Java 8 中新方法的版本:
It looks like you are willing to create a temporary
Map
, so I'd do it like this:Here,
patch
is the map that you are adding to thetarget
map.Thanks to Louis Wasserman, here's a version that takes advantage of the new methods in Java 8:
使用 Guava 的 Maps 类的实用方法来计算 2 个地图的差异,您可以在单个地图中完成线,有方法签名可以让您更清楚地了解您想要完成的任务:
Using Guava's Maps class' utility methods to compute the difference of 2 maps you can do it in a single line, with a method signature which makes it more clear what you are trying to accomplish:
只需迭代并添加:
编辑添加:
如果您可以对 a 进行更改,您也可以这样做:
并且 a 将完全满足您的需要。 (
b
中的所有条目以及a
中不在b
中的所有条目)Just iterate and add:
Edit to add:
If you can make changes to a, you can also do:
and a will have exactly what you need. (all the entries in
b
and all the entries ina
that aren't inb
)如果您在 @erickson 的解决方案中更改地图顺序,则只需 1 行即可完成:
在这种情况下,您可以将 mapWithNotSoImportantValues 中的值替换为具有相同键的 mapWithImportantValues 中的值。
You can make it in just 1 line if you change maps order in @erickson's solution:
In this case you replace values in mapWithNotSoImportantValues with value from mapWithImportantValues with the same keys.
使用
Map#merge
的 Java 8 解决方案自 java-8 您可以使用
Map#merge(K key, V value, BiFunction remappingFunction)
使用remappingFunction< 将值合并到
Map
中/code> 如果已在您想要将其放入的Map
中找到该密钥。该代码迭代
newMap
条目(key
和value
),并通过方法map
将每个条目合并到map
中。代码>合并。remappingFunction
在重复键的情况下被触发,在这种情况下,它表示将使用以前的(原始)oldValue
值而不是重写。使用此解决方案,您不需要临时
地图
。让我们举一个例子,将
newMap
条目合并到map
中,并保留原始值以防出现重复的 antry。Java 8 solution using
Map#merge
As of java-8 you can use
Map#merge(K key, V value, BiFunction remappingFunction)
which merges a value into theMap
usingremappingFunction
in case the key is already found in theMap
you want to put the pair into.The code iterates the
newMap
entries (key
andvalue
) and each one is merged intomap
through the methodmerge
. TheremappingFunction
is triggered in case of duplicated key and in that case it says that the former (original)oldValue
value will be used and not rewritten.With this solution, you don't need a temporary
Map
.Let's have an example of merging
newMap
entries intomap
and keeping the original values in case of the duplicated antry.Java 8 有这个 API 方法可以满足您的要求。
如果指定的键尚未与值关联(或映射为 null),则将其与给定值关联并返回 null,否则返回当前值。
With Java 8 there is this API method to accomplish your requirement.
If the specified key is not already associated with a value (or is mapped to null) associates it with the given value and returns null, else returns the current value.
正如其他人所说,您可以使用
putIfAbsent
。迭代映射中要插入的每个条目,并在原始映射上调用此方法:As others have said, you can use
putIfAbsent
. Iterate over each entry in the map that you want to insert, and invoke this method on the original map: