Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HashMap删除键/值_Java_Hashmap - Fatal编程技术网

Java HashMap删除键/值

Java HashMap删除键/值,java,hashmap,Java,Hashmap,我只是想了解一下为什么在HashMap上迭代更好 例如,下面的代码(在我看来)做了完全相同的事情(或者应该如此)。但是,如果我不遍历HashMap,则不会删除密钥 _adjacentNodes.remove(node); Iterator<Map.Entry<String, LinkedList<Node>>> iterator = _adjacentNodes.entrySet().iterator(); while (iterator.h

我只是想了解一下为什么在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();
     }
}
\u相邻节点。删除(节点);
迭代器迭代器=_adjacentNodes.entrySet().Iterator();
while(iterator.hasNext()){
Map.Entry=iterator.next();
if(node.getNodeID().contentEquals(entry.getKey())){
iterator.remove();
}
}

发生了什么事?

由于密钥是字符串,所以应该删除字符串而不是节点。所以试试看

_adjacentNodes.remove(node.getNodeID());   
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 );
        }
    }
}
我能想到的唯一一件出错的事情是,您试图在开始时删除的节点对象与您从迭代器中获得的节点对象不是同一个节点对象。也就是说,它们具有相同的“NodeID”,但是不同的对象。也许您值得检查remove()的返回


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

这里的要点是,如果您在hashmap上进行迭代,然后试图对其进行操作,它将失败,因为您无法做到这一点(甚至还有一个例外)


因此,您需要使用迭代器删除您正在迭代的列表中的项目。

hkn刚刚回复说我的密钥是字符串,我试图删除该对象。您的帖子不正确。引用Oracle关于集合的教程:请注意,Iterator.remove是在迭代期间修改集合的唯一安全方法;如果在迭代过程中以任何其他方式修改基础集合,则该行为未指定。这是一个很好的例子,如何迭代
EntrySet
并删除
HashMap
\u adjacentNodes
)中的实际值。更方便的方法是迭代
键集
。条件将稍微复杂一些(…'node.getNodeID().contentEquals(_adjacentNodes.get(entry.getKey()).getNodeID())')…),但从HashMap中查找值应该很快。
Before removal
b
a


After removal
b