-1

Вот мой код:Java App бросает ConcurrentModificationException

public class Test { 
    public static void main(String[] args){ 
     ArrayList<Integer> list = new ArrayList(); 
     list.add(1); 
     list.add(2); 
     list.add(2); 
     list.add(2); 
     list.add(5); 
     int inteval = 0; 
     Iterator<Integer> it = list.iterator(); 
     for(;it.hasNext();){ 
      Integer n = it.next(); 
      list.remove(n); 
      if (list.contains(n-inteval)){ 
       list.remove(list.indexOf(n-inteval)); 
       if (list.contains(n-inteval-inteval)){ 
        list.remove(list.indexOf(n-inteval-inteval)); 
       }else{ 
        list.add(n-inteval); 
        list.add(n); 
       } 
      } 
     } 
    } 
} 

этот код будет бросать ConcurrentModificationException, я судимый использовать CopyOnWriteArrayList, но я нашел it.next() возвращает значение, которое удалено от последнего времени! как я могу его исправить?

+0

Возможный дубликат [Итерация через Collection, избегая при удалении ConcurrentModificationException в цикле] (http://stackoverflow.com/questions/223918/iterating-through-a-collection- avoiding-concurrentmodificationexception-when-re) – Raedwald

ответ

0

Это происходит потому, что вы делаете следующее:

Iterator<Integer> it = list.iterator(); 
    for(;it.hasNext();){ 
     Integer n = it.next(); 
     list.remove(n); 

При использовании Iterator, вы не можете изменить list с list.remove(), list.add() функций. Чтобы удалить элементы с помощью итератора, необходимо вызвать it.remove(), который удаляет полученный элемент с помощью it.next(). Если вы действительно хотите сделать это, то вы должны сделать следующее:

for(int i = 0; i < list.size(); i++){ 
     Integer n = list.get(i); 
    ... 

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

+0

Я не думаю, что это хорошее решение, потому что list.size() всегда будет меняться! –

+0

Да, вы правы, и когда вы удаляете текущий элемент, вам нужно настроить индекс как 'i -;' и прочее. Я смущен тем, что именно вы пытаетесь сделать, поэтому я не могу сказать вам, как сделать лучшее решение. – EpicPandaForce

+0

https://code.google.com/codejam/contest/4214486/ У меня есть правильный ответ, но я должен был бы ответить на ваш ответ. ты можешь? –

0

Вы не должны изменять список после получения Итератора, используя любой из методов списка.

Как уже указывалось - метод удаления вызова в экземпляре Iterator.

, например -

public class Test { 
    public static void main (String... at) throws Exception { 
     ArrayList<Integer> list = new ArrayList<Integer>(); 
     list.add(1); 
     list.add(2); 
     list.add(2); 
     list.add(2); 
     list.add(5); 

     Iterator<Integer> it = list.iterator(); 
     //below while will remove every element from the list 
     while (it.hasNext()) { 
      it.next(); 
      it.remove(); 
     } 
     //this will leave 5 as the only element in list 
     /*while (it.hasNext()) { 
      if (it.next() != 5) { 
       it.remove(); 
      } 
     }*/ 
     //below loop will remove all the occurences of 1 or 2 
     while (it.hasNext()) { 
      Integer number = it.next(); 
      if (number == 1 || number == 2) { 
       it.remove(); 
      } 
     } 
     System.out.println(list.toString()); 
    } 
} 
+0

Как удалить элемент по его индексу или самому себе? например: мне нужно удалить 2 и удалить 1 в цикле while –

+0

@JasonYang - добавили еще одну секцию цикла для нее. – Tirath

+0

Мне нужен был Datastruct, поставщик которого дублировал набор. который я могу изменить в It iterator. –

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