Удалите несколько ключей из карты эффективным способом?
У меня есть Map<String,String>
с большим количеством пар значений. Теперь я хочу удалить выбранные ключи из этого Map
. Следующий код показывает, что я сделал для этого.
Set keySet = new HashSet(); //I added keys to keySet which I want to remove.
Тогда:
Iterator entriesIterator = keySet.iterator();
while (entriesIterator.hasNext()) {
map.remove( entriesIterator.next().toString());
}
Это работает. Я просто хочу знать, что было бы лучшим способом достичь моего требования?
Ответы
Ответ 1
Предполагая, что ваш набор содержит строки, которые вы хотите удалить, вы можете использовать метод keySet
и map.keySet().removeAll(keySet);
.
keySet
возвращает представление Set для ключей, содержащихся на этой карте. Набор поддерживается картой, поэтому изменения в карте отражаются в наборе и наоборот.
Упрощенный пример:
Map<String, String> map = new HashMap<>();
map.put("a", "");
map.put("b", "");
map.put("c", "");
Set<String> set = new HashSet<> ();
set.add("a");
set.add("b");
map.keySet().removeAll(set);
System.out.println(map); //only contains "c"
Ответ 2
Только для полноты:
Как и предполагалось, java.util.AbstractSet#removeAll
действительно выполняет итерацию по всем элементам, но с одним небольшим трюком: он использует итератор меньшей коллекции:
if (size() <= collection.size()) {
Iterator<?> it = iterator();
while (it.hasNext()) {
if (collection.contains(it.next())) {
it.remove();
}
}
} else {
Iterator<?> it = collection.iterator();
while (it.hasNext()) {
remove(it.next());
}
}
Ответ 3
Использование потока Java:
keySet.forEach(map::remove);