我需要将一个HashMap中的所有键和值复制到另一个HashMap中,但不替换现有的键和值。
最好的方法是什么?
我在想,可以不用迭代keySet并检查它是否存在,而是:
Map temp = new HashMap(); // generic later
temp.putAll(Amap);
A.clear();
A.putAll(Bmap);
A.putAll(temp);
我需要将一个HashMap中的所有键和值复制到另一个HashMap中,但不替换现有的键和值。
最好的方法是什么?
我在想,可以不用迭代keySet并检查它是否存在,而是:
Map temp = new HashMap(); // generic later
temp.putAll(Amap);
A.clear();
A.putAll(Bmap);
A.putAll(temp);
看起来您想创建一个临时的 Map
,那么我会这样做:
Map tmp = new HashMap(patch);
tmp.keySet().removeAll(target.keySet());
target.putAll(tmp);
这里的patch
是您要添加到target
map中的映射。
感谢Louis Wasserman,以下是利用Java 8中的新方法的版本:
patch.forEach(target::putIfAbsent);
使用Guava的Maps类的实用方法来计算两个Map之间的差异,你可以在一行代码中完成它,使用这种方法签名可以更清楚地表明你试图实现什么:
public static void main(final String[] args) {
// Create some maps
final Map<Integer, String> map1 = new HashMap<Integer, String>();
map1.put(1, "Hello");
map1.put(2, "There");
final Map<Integer, String> map2 = new HashMap<Integer, String>();
map2.put(2, "There");
map2.put(3, "is");
map2.put(4, "a");
map2.put(5, "bird");
// Add everything in map1 not in map2 to map2
map2.putAll(Maps.difference(map1, map2).entriesOnlyOnLeft());
}
只需迭代并添加:
for(Map.Entry e : a.entrySet())
if(!b.containsKey(e.getKey())
b.put(e.getKey(), e.getValue());
补充说明:
如果你可以对a进行更改,你也可以执行以下操作:
a.putAll(b)
您需要的是完全匹配 b
中的所有条目和 a
中不在 b
中的所有条目。
entrySet()
返回一个Set<Map.Entry>
。
2.) java.util.Map
ä¸æ²¡æœ‰contains(...)
方法。 - Fabian BarneymapWithNotSoImportantValues.putAll( mapWithImportantValues );
Map#merge
的Java 8解决方案从java-8开始,您可以使用Map#merge(K key, V value, BiFunction remappingFunction)
将值合并到Map
中,在该Map
中找到键时,使用remappingFunction
将其与要放入其中的键值对合并。
// using lambda
newMap.forEach((key, value) -> map.merge(key, value, (oldValue, newValue) -> oldValue));
// using for-loop
for (Map.Entry<Integer, String> entry: newMap.entrySet()) {
map.merge(entry.getKey(), entry.getValue(), (oldValue, newValue) -> oldValue);
}
newMap
条目(key
和value
),并通过方法merge
将每个条目合并到map
中。如果出现重复的键,则会触发remappingFunction
,在这种情况下,它会使用先前(原始)oldValue
值而不是被重写的值。Map
。
newMap
的条目合并到map
中,并在出现重复条目时保留原始值。Map<Integer, String> newMap = new HashMap<>();
newMap.put(2, "EVIL VALUE"); // this will NOT be merged into
newMap.put(4, "four"); // this WILL be merged into
newMap.put(5, "five"); // this WILL be merged into
Map<Integer, String> map = new HashMap<>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
newMap.forEach((k, v) -> map.merge(k, v, (oldValue, newValue) -> oldValue));
map.forEach((k, v) -> System.out.println(k + " " + v));
1 one
2 two
3 three
4 four
5 five
正如其他人所说,您可以使用 putIfAbsent
。遍历要插入的地图中的每个条目,并在原始地图上调用此方法:
mapToInsert.forEach(originalMap::putIfAbsent);
在Java 8中,有这个API方法可以实现你的要求。
map.putIfAbsent(key, value)
如果指定的键还没有与值相关联(或者已映射为 null),则将其与给定的值进行关联并返回 null,否则返回当前值。
public class MyMap {
public static void main(String[] args) {
Map<String, String> map1 = new HashMap<String, String>();
map1.put("key1", "value1");
map1.put("key2", "value2");
map1.put("key3", "value3");
map1.put(null, null);
Map<String, String> map2 = new HashMap<String, String>();
map2.put("key4", "value4");
map2.put("key5", "value5");
map2.put("key6", "value6");
map2.put("key3", "replaced-value-of-key3-in-map2");
// used only if map1 can be changes/updates with the same keys present in map2.
map1.putAll(map2);
// use below if you are not supposed to modify the map1.
for (Map.Entry e : map2.entrySet())
if (!map1.containsKey(e.getKey()))
map1.put(e.getKey().toString(), e.getValue().toString());
System.out.println(map1);
}}
patch.forEach(target::putIfAbsent)
。其中,将patch
集合中的元素逐个传递给target.putIfAbsent()
方法进行操作。 - Louis Wasserman