Java HashMap 删除键/值

2022-09-03 01:31:12

我只是在寻找一个解释和/或见解,为什么迭代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();
     }
}

这是怎么回事?


答案 1

由于您的键是字符串,因此应删除字符串而不是节点。所以试试

_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

我唯一能想到的出错的是,您尝试在开始时删除的节点对象与您从迭代器获得的节点对象不是同一个节点对象。也就是说,它们具有相同的“NodeID”,但具有不同的对象。也许值得您检查 remove() 的返回。

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