通过地图迭代

时间:2015-10-02 15:33:11

标签: java iterator

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

    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;
}

但我一直收到这个错误:     线程&#34; main&#34;中的例外情况java.util.ConcurrentModificationException     at java.util.HashMap $ HashIterator.nextNode(HashMap.java:1429)     在java.util.HashMap $ EntryIterator.next(HashMap.java:1463)     at java.util.HashMap $ EntryIterator.next(HashMap.java:1461)     在org.tartarus.snowball.TestApp.controlVocab(TestApp.java:114)     在org.tartarus.snowball.TestApp.main(TestApp.java:619)

这有意义吗?

1 个答案:

答案 0 :(得分:0)

是的,这是有道理的:因为一个线程修改集合时通常不允许official oracle documentation says,而另一个线程正在迭代它。

也许最好的方法是在新列表中收集要删除的元素,然后在此列表上进行迭代,删除原始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);
}