【问题标题】:Iterating through map [duplicate]遍历地图[重复]
【发布时间】:2015-12-30 21:00:02
【问题描述】:

我正在尝试遍历地图并删除某些元素以构建受控词汇表。这是我的代码:

    public static Map<String, Integer> controlVocab(Map<String, Integer> docf){
    Set<String> set = docf.keySet();
    Iterator<String> itr = set.iterator();
    for (Map.Entry <String, Integer> entry : docf.entrySet())
    {
        if(entry.getValue()<50){
            docf.remove(entry.getKey());
        }
    }
    return docf;
}

但我不断收到此错误: 线程“主”java.util.ConcurrentModificationException 中的异常 在 java.util.HashMap$HashIterator.nextNode(HashMap.java:1429) 在 java.util.HashMap$EntryIterator.next(HashMap.java:1463) 在 java.util.HashMap$EntryIterator.next(HashMap.java:1461) 在 org.tartarus.snowball.TestApp.controlVocab(TestApp.java:114) 在 org.tartarus.snowball.TestApp.main(TestApp.java:619)

这有意义吗?

【问题讨论】:

    标签: java iterator


    【解决方案1】:

    是的,这是有道理的:因为 official oracle documentation says 通常不允许一个线程在另一个线程对其进行迭代时修改 Collection。

    也许最好的方法是在一个新的 List 中收集你想要删除的元素,然后在这个列表上迭代删除原始 Map 中的对应条目。

    试试这样的:

    List<String> mylist = new ArrayList<String>();
    for (Map.Entry <String, Integer> entry : docf.entrySet()){
            if(entry.getValue()<50){
                mylist.add(entry.getKey());
            }
    }
    
    for (String key : mylist){
            docf.remove(key);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-20
      • 2016-10-16
      • 2013-12-06
      • 2011-03-23
      • 2020-10-23
      • 2011-12-22
      • 1970-01-01
      相关资源
      最近更新 更多