Удаление всех элементов заданного значения из хэш-карты

Итак, у меня есть 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.