[英]Java merge two maps
我需要按照以下規則在第一個地圖中合並兩個地圖:
我需要從map1
刪除map2
中不存在的所有鍵。 我需要使用map2
這些鍵下存在的適當值來更新map1
中的所有鍵。
這是我當前的代碼:
Set<String> keysToRemove = new HashSet<>();
map1.forEach((k, v) -> {
if (!map2.containsKey(k)) {
keysToRemove.add(k);
} else {
map1.put(k, map2.get(k));
}
});
for (String k : keysToRemove) {
map1.remove(k);
}
我不確定我的代碼是否最佳,是否可以改進。 您能否說明如何更有效地執行此任務?
您可以兩行實現
該解決方案基於注釋(給人一種印象,因為OP希望map1是map2的精確副本)
[...]我正在嘗試在原始map1上保留相同的參照,並且不要將其替換為新地圖。[sic]
//Retains only those keys that are in map2
map1.keySet().retainAll(map2.keySet());
//(Possibly) Overwrite value for each key in map2 into map1
map2.forEach(map1::put);
我認為這不會幫助您提高性能。
編輯:由雅各布·G。@建議,您可以為最后一行使用map1.putAll(map2)
編輯2:
如果我們考慮OP(而不是注釋),則如果map2中有任何鍵不在map1中,則它不應以map1結尾,因此最后一條語句變為
map1.forEach((key, value) -> map1.put(key, map2.get(key)));
我認為您可以使用Iterator
刪除第二個循環
Iterator<Map.Entry<K,V>> iter = map1.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<K,V> entry = iter.next();
if(not map2 contain k){
iter.remove();
} else {
entry.put new data
}
}
這里的關鍵是,您無法在Map.entrySet()
循環時更新地圖,它將引發ConcurrentModificationException
,但是您可以使用Iterator
。
另一種方法可能是僅使用map2中可用的鍵進行過濾,最后使用map將現有值替換為map2中的鍵。 與此類似的方法可能會解決問題:
map1.entrySet().stream().
filter(e -> map2.containsKey(e.getKey())).
map(e -> map2.get(e.getKey()))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.