Как удалить другой элемент (не тот, который вы держите) во время итерации HashMap - PullRequest
0 голосов
/ 21 января 2012

Я попытался выполнить поиск в Интернете, чтобы найти решение для удаления другого элемента, но не того, который вы посещаете.К сожалению, нет способа сделать это.

Вот проблема.

Предположим, у меня есть хэш-карта и элементы <0,10> <1,20> <2,30>

    Map<Integer,Integer> map = new HashMap<Integer, Integer>() ;
    Iterator<Map.Entry<Integer, Integer> >entries = map.entrySet().iterator();

    while (entries.hasNext()) {
        Entry<Integer, Integer> entry = entries.next();
        int temp = entry.getValue();
        if (temp==0){
            map.remove(2);  //2 is the key of 3th item
        }
    }

Тогда проблема возникает.Очень ценю предложения.

Ответы [ 4 ]

5 голосов
/ 21 января 2012

Сделайте это в два прохода:

  1. перебирайте записи и собирайте ключи для удаления в Set<Integer>
  2. переберите набор и удалите все ключи, которые он содержит, с карты. (Или звоните map.keySet().removeAll(keysToRemove))
3 голосов
/ 21 января 2012

Дай угадаю, ты получаешь ConcurrentModificationException.

Это запечено. Джавадоки говорят, что это может быть брошено, если вы делаете то, что делаете.Вы можете либо следовать за @ JBNizet , либо вы можете перезапускать итерацию при каждом удалении элемента.То, что вы выберете, будет зависеть от вашей конкретной ситуации.

3-й вариант - создать копию набора записей и выполнить итерацию по ней.Это работает лучше всего, если перезапуск итерации стоит дорого, и вам нужно быстро удалить.

Iterator<Map.Entry<Integer, Integer> >entries = new HashSet<Map.Entry<Integer, Integer>>(map.entrySet()).iterator();
2 голосов
/ 21 января 2012

Сделайте это за 2 прохода, сначала накопите ключи для удаления, затем выполните фактическое удаление:

List<Integer> keysToRemove = ...

while (entries.hasNext()) {
    Entry<Integer, Integer> entry = entries.next();
    int temp = entry.getValue();
    if (temp==0){
        keysToRemove.add(2);
    }
 }

for (Integer key : keysToRemove)
    map.remove(key);
1 голос
/ 21 января 2012

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

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