Подтвердить что ты не робот

Java HashMap Удаление ключа/значения

Я просто ищу объяснение и/или понимание того, почему его лучше перебирать по HashMap.

Например, код ниже (в моих глазах) делает то же самое (или он должен). Однако, если я не перебираю HashMap, ключ не удаляется.

_adjacentNodes.remove(node);        

Iterator<Map.Entry<String, LinkedList<Node>>> iterator = _adjacentNodes.entrySet().iterator();
while (iterator.hasNext()) {
     Map.Entry<String, LinkedList<Node>> entry = iterator.next();
     if(node.getNodeID().contentEquals(entry.getKey())){
          iterator.remove();
     }
}

Что происходит?

4b9b3361

Ответ 1

Так как ваш ключ является строкой, вы должны удалить String не Node. Поэтому попробуйте

_adjacentNodes.remove(node.getNodeID());   

Ответ 2

remove() работает должным образом. Например, учитывая эту программу:

import java.util.HashMap;


public class HashMapExample {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<String, Integer>();

        map.put("a", 1);
        map.put("b", 2);

        System.out.println("Before removal");
        for( String s : map.keySet() ) {
            System.out.println( s );
        }

        System.out.println("\n\nAfter removal");

        map.remove("a");
        for( String s : map.keySet() ) {
            System.out.println( s );
        }
    }
}

В результате вы получите следующее:

Before removal
b
a


After removal
b

Единственное, что я могу думать о том, что происходит, - это то, что объект node, который вы пытаетесь удалить в начале, - это не тот же объект node, что и тот, который вы получаете от итератора. То есть они имеют один и тот же "NodeID", но являются разными объектами. Возможно, вам стоит проверить возврат remove().

Изменить: Ха Я не заметил ошибку String/Object, но по крайней мере мы шли по правильному пути; )

Ответ 3

Дело в том, что если вы выполняете итерацию по хэш-карте, а затем пытаетесь ее манипулировать, она потерпит неудачу, потому что вы не можете этого сделать (для этого есть исключение).

Поэтому вам нужно использовать итератор для удаления элемента в самом списке, который вы выполняете.