从集合中删除项目调用java.util.ConcurrentModificationException

时间:2013-06-04 16:59:46

标签: java exception loops collections

我试图从两个排序列表中创建排名。

 List<Ordered<String>> rankedList = Collections.synchronizedList(WebCBIR.run(queryData, clusters, idf));
 List<Ordered<String>> rankedList2 = Collections.synchronizedList(WebCBIR.run(queryData, clusters));
 LinkedList<Ordered<String>> result = new LinkedList<>();
 Iterator<Ordered<String>> it = rankedList.iterator();
 Iterator<Ordered<String>> it2 = rankedList2.iterator();

 while (it.hasNext() && it2.hasNext())  {

        Ordered<String> o1 = it.next();
        Ordered<String> o2 = it2.next();
        Ordered<String> o = null;
        if(o1.value() > o2.value()){
            o = o1;
            rankedList.remove(o);
            rankedList2.remove(o);
        }
        else{
            o = o2;
            rankedList.remove(o);
            rankedList2.remove(o);

        }
        result.add(o);
}

此代码调用java.util.ConcurrentModificationException。怎么处理呢?

3 个答案:

答案 0 :(得分:8)

使用迭代器不要从列表中删除,而是使用iterator.remove()方法

while (it.hasNext() && it2.hasNext())  {

        Ordered<String> o1 = it.next();
        Ordered<String> o2 = it2.next();
        Ordered<String> o = null;
        if(o1.value() > o2.value()){
            o = o1;
            it.remove();
            it2.remove();
        }
        else{
            o = o2;
            it.remove();
            it2.remove();

        }
        result.add(o);
}

答案 1 :(得分:0)

您无法迭代Collection并同时修改它。

答案 2 :(得分:0)

使用迭代器迭代它时修改集合的唯一方法是通过迭代器本身。由于您希望通过删除可能不是其中一个迭代器的当前元素的元素来修改这两个集合,因此您无法使用Iterator.remove()。我建议累积一组要删除的元素,然后在迭代完成后再完成所有操作。由于您已经在result累积,因此可以使用:

while (it.hasNext() && it2.hasNext())  {

    Ordered<String> o1 = it.next();
    Ordered<String> o2 = it2.next();
    Ordered<String> o = o1.value() > o2.value() ? o1 : o2;
    result.add(o);
}
rankedList.removeAll(result);
rankedList2.removeAll(result);