-2

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

0

コレクションをイテレータで繰り返しながらコレクションを変更する唯一の方法は、イテレータ自体を使用することです。イテレータの 1 つの現在の要素ではない可能性のある要素を削除して両方のコレクションを変更する必要があるため、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 に答える