首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java HashMap删除键/值

Java HashMap删除键/值
EN

Stack Overflow用户
提问于 2011-06-30 15:06:14
回答 3查看 90.8K关注 0票数 17

我只是在寻找一个解释和/或洞察,为什么在HashMap上迭代更好。

例如,下面的代码(在我看来)做了完全相同的事情(或者应该是这样)。但是,如果我不遍历HashMap,键就不会被删除。

代码语言:javascript
复制
_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();
     }
}

怎么一回事?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-30 15:24:44

因为你的key是一个字符串,所以你应该删除String而不是Node。所以试一试

代码语言:javascript
复制
_adjacentNodes.remove(node.getNodeID());   
票数 14
EN

Stack Overflow用户

发布于 2011-06-30 15:28:34

remove()确实按预期工作。例如,给定以下程序:

代码语言:javascript
复制
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 );
        }
    }
}

这将输出以下内容:

代码语言:javascript
复制
Before removal
b
a


After removal
b

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

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

票数 9
EN

Stack Overflow用户

发布于 2011-06-30 15:29:12

这里的要点是,如果您在hashmap上迭代,然后尝试操作它,它将失败,因为您不能这样做(甚至有一个例外)。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6531132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档