我只是在寻找一个解释和/或洞察,为什么在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();
}
}
怎么一回事?
发布于 2011-06-30 15:24:44
因为你的key是一个字符串,所以你应该删除String而不是Node。所以试一试
_adjacentNodes.remove(node.getNodeID());
发布于 2011-06-30 15:28:34
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()的返回值是值得的。
编辑: Ha我没有发现字符串/对象的错误,但至少我们走的是正确的道路;)
发布于 2011-06-30 15:29:12
这里的要点是,如果您在hashmap上迭代,然后尝试操作它,它将失败,因为您不能这样做(甚至有一个例外)。
因此,您需要使用迭代器来删除正在迭代的列表上的项。
https://stackoverflow.com/questions/6531132
复制相似问题