我试图从两个排序列表中创建排名。
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。怎么处理呢?
答案 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);