Удаление всех элементов заданного значения из хэш-карты
Итак, у меня есть hashmap java, как показано ниже:
hMap.put("1", "One");
hMap.put("2", "Two");
hMap.put("3", "Two");
Я хотел бы удалить ВСЕ элементы, где значение равно "Два"
Если я сделаю что-то вроде:
hmap.values().remove("Two");
Только первый удаляется, я хочу удалить их все, как это можно сделать?
Ответы
Ответ 1
hmap.values().removeAll(Collections.singleton("Two"));
РЕДАКТИРОВАТЬ: (существенный) недостаток с этим кратким подходом заключается в том, что вы в основном вынуждены комментировать его, говоря что-то вроде
// remove("Two") would only remove the first one
В противном случае какой-то здравомыслящий инженер попытается как-то упростить его для вас и сломать. Это происходит... иногда благими намерениями становятся даже будущие!
Ответ 2
В Java 8
hmap.values().removeIf(val -> "Two".equals(val));
Ответ 3
for (Iterator<Map.Entry<String,String>> it = hMap.entrySet().iterator(); it.hasNext();) {
Map.Entry<String,String> e = it.next();
if ("Two".equals(e.getValue())) {
it.remove();
}
}
Ответ 4
Вы можете использовать while( hmap.values().remove("Two") );
, поскольку вызов remove возвращает true
, если коллекция была изменена в результате вызова.
Ответ 5
(Обновленное решение для регистрации удаленных значений)
В этом решении используется библиотека коллекций google [LINK]
import static com.google.common.collect.Maps.filterValues;
import static com.google.common.base.Predicates.equalTo;
...
Map<String, String> removedValues = filterValues(hMap, equalTo("Two"));
System.out.println(removedValues); //Log Removed Values
removedValues.clear(); //Removes from original map, since this is a view.
Примечание. Это решение использует тот факт, что Map, возвращаемый вызовом filterValues, представляет собой представление элементов в исходном HashMap. Это позволяет нам исследовать их и вывести ключи, которые были удалены, а затем удалить их с исходной карты с помощью простого вызова clear().
У вас могут быть причины не хотеть использовать библиотеку коллекций google в вашем проекте, но если вы этого не сделаете, я бы предложил проверить его.
Ответ 6
Вам нужно выполнить итерацию по списку, посмотреть объект значения и условно удалить. Обратите внимание, что вы получите исключение, если попытаетесь удалить объект во время итерации над HashMap
. Вам нужно будет сделать копию карты или использовать ConcurrentHashMap
.