-2

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

 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。如何处理?

4

3 回答 3

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);
}
于 2013-06-04T17:01:27.330 回答
0

您不能在 a 上迭代Collection并同时对其进行修改。

于 2013-06-04T17:01:49.330 回答
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);
于 2013-06-04T17:05:20.503 回答