2011-06-30 68 views
15

我只是寻找一个解释和/或洞察力,为什么它更好地迭代HashMap。Java 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(); 
    } 
} 

这是怎么回事?

回答

13

由于你的密钥是一个字符串,你应该删除字符串不是节点。所以试试

_adjacentNodes.remove(node.getNodeID()); 
8

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()的返回值。

编辑:哈我没有发现字符串/对象的错误,但至少我们走的是正确的道路; )

+0

hkn刚刚回应说明我的密钥是一个字符串,我试图删除该对象。 –

+0

是的,看到编辑,他在我输入的时候发布。 –

0

这里的要点是,如果你迭代hashmap,然后试图操纵它,它会失败,因为你不能这样做(甚至有一个例外)。

所以你需要使用一个迭代器来删除你正在迭代的列表上的一个项目。

+2

您发布的信息不对。引用Oracle关于集合的教程: _注意Iterator.remove是在迭代过程中修改集合的唯一安全方法;如果在迭代过程中以任何其他方式修改了基础集合,则行为是未指定的。[ [请参阅引用源](http://download.oracle.com/javase/tutorial/collections/interfaces/collection。 HTML) – comrad