2013-06-04 3 views
-2

두 개의 정렬 된 목록에서 순위를 만들려고했습니다.컬렉션에서 항목을 제거하면 java.util.ConcurrentModificationException이 호출됩니다.

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

이 예외는 ModificationWhileIteratingException' '라고되어 있어야합니다 : 이미 result에 축적되어 있기 때문에, 당신은 사용할 수 있습니다. 스레딩 동시성은 오류와 아무 관련이 없기 때문에 많은 혼란을 피할 수 있습니다. 이것은 SO에 관한 그런 첫 번째 질문과는 거리가 멀다! – yshavit

답변

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); 
} 
+0

+1 우수 답변. – eternay

+0

이것은 OP의 코드와 논리적으로 동일하지 않습니다. OP는 각각의 반복자의 현재 요소가 아니라'it'와'it2'에서'o'를 제거하려고합니다. –

+0

True .. 나는 논리에주의를 기울이지 않았다. 단지 iterator의 remove 메소드를 사용해야한다는 것을 전달하고자했다. 그것을 지적 주셔서 감사합니다. – sanbhat

0

당신은 Collection에 반복하고 동시에 수정할 수 없습니다에게 대신 목록에서 제거 사용하지 않는 반복자 을 사용하는 동안.

0

반복자를 사용하여 컬렉션을 반복하면서 컬렉션을 수정하는 유일한 방법은 반복자 자체를 사용하는 것입니다. 반복자 중 하나의 요소가 아닌 요소를 제거하여 두 컬렉션을 모두 수정하려는 경우 Iterator.remove()을 사용할 수 없습니다. 제거 할 요소 집합을 누적 한 다음 반복 작업이 완료된 후 모든 작업을 수행하는 것이 좋습니다.

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); 
관련 문제