2017-01-31 3 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

Использовать 'iter.remove();' удалить во время iteracting –

ответ

1

Изменить код следующие за ее решение -

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 выбрасываются из следующего() метода итератора, если есть какие-либо структурные изменения в основной коллекции (в вашем случае Queue), т.е. любой элемент добавляется или удаляется непосредственно в очереди. Он называется Fail Fast Iterator.

+0

iter ... it ... :) –

+0

Спасибо @Vikas Sachdeva !! оно работает! могу я узнать почему? благодаря! – user7495150

+0

Вы не хотите Объяснять? копирование и вставка кода с изменением его не поможет узнать ... –

0

Попробуйте использовать ConcurrentLinkedQueue вместо PriorityQueue

Acording к: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html

Помните, что, в отличии от большинства коллекций, метод размера не операция постоянная времени. Из-за асинхронности этих очередей определение текущего количества элементов требует обхода элементов и поэтому может сообщать о неточных результатах, если эта коллекция будет изменена во время обхода.

+0

что это? можете ли вы объяснить больше? предпочитал быть с примером –

0

С помощью Java8 вы можете удалить с помощью removeIf, который является частью договора Collection.

Учитывая, что removeIf метод принимает предикат, ваш код может быть столь же просто, как:

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

Что касается Параллельное исключения вы имели, это просто произошло потому, что вы пытались удалить вызова PriorityQueue#remove непосредственно в то время как вы уже были итерации, которые сделают итератор устаревшим. Правильный способ удаления при итерации осуществляется с помощью Iterator#next, а затем Iterator#remove (это фактически то, что делает по умолчанию removeIf).

Смежные вопросы