Java HashMap Удаление ключа / значения - PullRequest
16 голосов
/ 30 июня 2011

Я просто ищу объяснение и / или понимание того, почему лучше перебирать 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();
     }
}

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

Ответы [ 3 ]

13 голосов
/ 30 июня 2011

Поскольку ваш ключ - строка, вы должны удалить строку, а не узел. Так что попробуйте

_adjacentNodes.remove(node.getNodeID());   
8 голосов
/ 30 июня 2011

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

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

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

0 голосов
/ 30 июня 2011

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

Так что вам нужно использовать итератор для удаления элемента из того самого списка, по которому вы перебираете.

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