我试图遍历地图并删除某些元素以构建受控词汇表。这是我的代码:
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)
这有意义吗?
答案 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);
}