有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在迭代HashMap时删除另一项(不是您所持有的项)

我试着在互联网上搜索,以找到一个解决方案,删除另一个项目,但不是你正在访问的项目。不幸的是,没有办法做到这一点

问题就在这里

假设我有一个hashmap和 这些项目是<;0,10>&书信电报;1,20>&书信电报;2,30>

    Map<Integer,Integer> map = new HashMap<Integer, Integer>() ;
    Iterator<Map.Entry<Integer, Integer> >entries = map.entrySet().iterator();

    while (entries.hasNext()) {
        Entry<Integer, Integer> entry = entries.next();
        int temp = entry.getValue();
        if (temp==0){
            map.remove(2);  //2 is the key of 3th item
        }
    }

然后问题就来了。 非常感谢你的建议


共 (4) 个答案

  1. # 1 楼答案

    让我猜猜,你得到了^{}

    那是烤熟的。javadocs说,如果你做你正在做的事情,它可能会被抛出。您可以遵循@JBNizet's,也可以在每次删除元素时重新开始迭代。你的选择将取决于你的具体情况

    第三个选项是创建条目集的副本并对其进行迭代。如果重新启动迭代的成本很高,并且需要快速删除,那么这种方法效果最好

    Iterator<Map.Entry<Integer, Integer> >entries = new HashSet<Map.Entry<Integer, Integer>>(map.entrySet()).iterator();
    
  2. # 2 楼答案

    不能在遍历HashMap时对其进行修改。例如,可以在遍历映射时收集要删除的键列表,然后在完成迭代后从映射中删除列表中的项

  3. # 3 楼答案

    分两次进行,首先累积要移除的键,然后执行实际移除:

    List<Integer> keysToRemove = ...
    
    while (entries.hasNext()) {
        Entry<Integer, Integer> entry = entries.next();
        int temp = entry.getValue();
        if (temp==0){
            keysToRemove.add(2);
        }
     }
    
    for (Integer key : keysToRemove)
        map.remove(key);
    
  4. # 4 楼答案

    分两次完成:

    1. 遍历条目,并在Set<Integer>中收集要删除的密钥
    2. 在集合上迭代,并从映射中删除它包含的所有键。(或致电^{