2017-01-31 2 views
1

ConcurrentmodificationException을 발생시키는 우선 순위 큐를 반복하는 데 문제가 있습니다. 반복하는 대한우선 순위 큐의 Java concurrentmodificationexception

코드 :

Queue<Patient> pq = new PriorityQueue<Patient>(); 
Iterator<Patient> it = pq.iterator();  
      while(iter.hasNext()){ 
       Patient current = iter.next(); 
       if(current.getName().equals(patientName)){ 

        pq.remove(p); 
        } 


       } 

이 오류는 iter.next()는 ConcurrentModificationException를 비용을 말한다. 해결 방법을 알려주십시오. 나는 인터넷 검색을하지만 여전히이 문제에 대한 해결책을 찾지 못한다.

+1

실제로 반복하는 큐의 요소는 삭제할 수 없습니다. – IQV

+0

이터레이터에서 요소를 제거 할 수 없습니다 –

+1

iteracting while 제거하기 위해 iter.remove();를 사용하십시오 –

답변

1
그것이 해결하기 위해 다음과 코드를 변경

Queue) 즉, 모든 요소가 큐에 직접 추가되거나 제거됩니다. Fail Fast Iterator이라고합니다.

+0

iter ... it ... :) –

+0

@Vikas Sachdeva에 감사드립니다! 그것은 작동합니다! 왜 그럴 수 있니? 감사! – user7495150

+0

설명하고 싶지 않으십니까? 코드를 복사하여 붙여 넣으면 코드를 배우는 데 도움이되지 않습니다. –

0

시도는 주문에 따라 대신 PriorityQueue 인

의 ConcurrentLinkedQueue를를 사용하는 대부분의 컬렉션과는 달리, https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html

가 조심, size 메소드는 일정 시간의 오퍼레이션은 아닌 것입니다. 이러한 대기열의 비동기 특성으로 인해 현재 요소 수를 결정할 때는 요소를 탐색해야하므로이 컬렉션이 순회 중 수정되면 부정확 한 결과가보고 될 수 있습니다. 귀하의 경우 (기본 컬렉션의 구조적 변화가있을 경우

Queue<Patient> pq = new PriorityQueue<Patient>(); 
Iterator<Patient> iter = pq.iterator();  
      while(iter.hasNext()){ 
       Patient current = iter.next(); 
       if(current.getName().equals(patientName)){ 

        iter.remove(); 
        } 


       } 

설명ConcurrentModificationException는, 반복자의) (다음 방법에서 발생합니다 -

+0

무엇입니까? 더 설명해 주시겠습니까? 예 : –

0

Java8부터 removeIf (Collection 계약의 일부)을 사용하여 제거 할 수 있습니다.

removeIf 방법은 술어 걸리는 점을 감안

, 당신의 코드처럼 간단 할 수있다 : 당신은 당신이 이미있는 동안 직접 PriorityQueue#remove를 호출 제거하려하기 때문에 당신이했던 동시 예외로

priorityQueue.removeIf(patient -> patient.getName().equals(patientName)); 

, 이것은 단순히 일이 이터레이터를 쓸모 없게 만드는 반복 작업. 반복 할 때 제거 할 적절한 방법은 Iterator#next을 사용하고 그 다음에 Iterator#remove을 사용하는 것입니다 (실제로 이것은 removeIf의 기본 구현이하는 것입니다).