簡體   English   中英

Java合並兩個地圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM