Java объединить две карты - PullRequest
0 голосов
/ 03 мая 2018

Мне нужно объединить две карты в первую по следующим правилам:

Мне нужно удалить все ключи из map1, которых нет в map2. Мне нужно обновить все ключи в map1 соответствующими значениями, которые присутствуют в map2 под этими ключами.

Это мой текущий код:

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);
}

Я не уверен, что мой код оптимален и его можно улучшить. Не могли бы вы показать, как более эффективно реализовать эту задачу?

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Вы можете достичь этого в две строки

Это решение основано на комментарии (которое создало впечатление, что ОП хотел, чтобы map1 была точной копией map2)

[...] Я пытаюсь сохранить ту же ссылку на исходную карту1 и не заменять ее новой картой. [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);

Я не верю, что это поможет вам улучшить производительность.

EDIT: Как предположил Джейкоб Г., у вас может быть map1.putAll(map2) для последней строки

EDIT2:

Если мы рассмотрим OP (а не комментарии), если в map2 есть какие-либо ключи, которых нет в map1, они не должны заканчиваться в map1, и, следовательно, последнее утверждение становится

map1.forEach((key, value) -> map1.put(key, map2.get(key)));
0 голосов
/ 03 мая 2018

Другим подходом может быть фильтрация только по ключам, доступным в map2, и, наконец, использование map для замены существующих значений на map2. Что-то похожее на это может помочь:

map1.entrySet().stream().
filter(e -> map2.containsKey(e.getKey())).
map(e -> map2.get(e.getKey()))
0 голосов
/ 03 мая 2018

Я думаю, что вы можете удалить второй цикл, используя 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...