Удаление всех элементов заданного значения из хэш-карты - PullRequest
18 голосов
/ 07 апреля 2010

Итак, у меня есть Java-хэш-карта, как показано ниже:

hMap.put("1", "One");
hMap.put("2", "Two");
hMap.put("3", "Two");

Я хотел бы удалить ВСЕ элементы, для которых установлено значение «Два»

Если я сделаю что-то вроде:

hmap.values().remove("Two");

Только первый удален, я хочу удалить их все, как это можно сделать?

Ответы [ 6 ]

44 голосов
/ 07 апреля 2010

hmap.values().removeAll(Collections.singleton("Two"));

РЕДАКТИРОВАТЬ: (существенным) недостатком этого краткого подхода является то, что вы в основном вынуждены комментировать это, говоря что-то вроде

// remove("Two") would only remove the first one

в противном случае, какой-нибудь доброжелательный инженер когда-нибудь попытается упростить его для вас и сломать.Это случается ... иногда благонамеренный добродетель - даже Будущее Ты!

22 голосов
/ 28 июля 2015

В Java 8

hmap.values().removeIf(val -> "Two".equals(val));
15 голосов
/ 07 апреля 2010
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();
 }
}

10 голосов
/ 07 апреля 2010

Вы можете использовать while( hmap.values().remove("Two") );, поскольку вызов удаления возвращает true, если коллекция была изменена в результате вызова.

6 голосов
/ 07 апреля 2010

(Обновленное решение для регистрации удаленных значений)

В этом решении используется библиотека 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.

Примечание. В этом решении используется тот факт, что карта, возвращаемая вызовом filterValues, является представлением элементов в исходном HashMap. Это позволяет нам изучить их и выйти из списка удаленных ключей, а затем удалить их с исходной карты простым вызовом clear ().

У вас могут быть причины, по которым вы не хотите использовать библиотеку google-коллекций в своем проекте, но если вы этого не сделаете, я бы рекомендовал проверить это.

2 голосов
/ 07 апреля 2010

Вы должны пройтись по списку, посмотреть на объект значения и условно выполнить удаление.Обратите внимание, что вы получите исключение, если попытаетесь удалить объект во время итерации по HashMap.Пришлось бы сделать копию карты или использовать ConcurrentHashMap.

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