Почему этот ArrayList вызывает исключение ConcurrentModificationException при попытке удалить элемент? - PullRequest
1 голос
/ 27 февраля 2012

Я пытаюсь удалить определенный элемент из Arraylist, он вызывает исключение ConcurrentModificationException

ArrayList<String> ar = new ArrayList<String>();
ar.add("a");
ar.add("b");
ar.add("c");
ar.add("a");
ar.add("e");
for(String st: ar){
    System.out.println("st="+st);
    if(st.equals("a")){
        ar.remove(st);
    }
}

любые комментарии, что я делаю не так?

Ответы [ 3 ]

4 голосов
/ 27 февраля 2012

Удалять элемент из массива только во время итерации, используя Iterator.remove().

Строка for(String st: ar) { немного вводит в заблуждениеВы фактически создаете итератор за кулисами, который используется для этой итерации.Если вам нужно удалить элементы внутри итерации, вам нужно явно использовать итератор, чтобы вы могли вызвать iterator.remove().

ArrayList<String> ar = new ArrayList<String>();
ar.add("a");
ar.add("b");
ar.add("c");
ar.add("a");
ar.add("e");
Iterator<String> it = ar.iterator();
while (it.hasNext()) {
    String st = it.next();
    System.out.println("st="+st);
    if (st.equals("a")) {
        it.remove();
    }
}
0 голосов
/ 27 февраля 2012

вы модифицируете массив, по которому вы перебираете.Я предлагаю вам использовать итератор, чтобы делать подобные вещи.

0 голосов
/ 27 февраля 2012

Вы удаляете элемент из коллекции во время итерации по этой коллекции, не используя итератор для этого. Не делай этого. Есть много альтернатив, в первую очередь:

  • Вместо этого используйте индексы (get, removeAt), проявляя осторожность при подсчете, чтобы не пропустить пункты

     for (int i = 0; i < ar.size(); i++) {
         String st = ar.get(i);
         System.out.println("st="+st);
         if(st.equals("a")) {
             ar.removeAt(i);
             i--; // We want to use this index again
         }
     }
    
  • Соберите коллекцию предметов для удаления, а затем удалите их все

    List<String> elementsToRemove = new ArrayList<String>();
    for(String st: ar){
        System.out.println("st="+st);
        if(st.equals("a")){
            elementsToRemove.add(st);
        }
    }
    ar.removeAll(elementsToRemove);
    
  • Удалить с помощью итератора, если итератор поддерживает удаление (как это делает ArrayList)

    for (Iterator<String> it = ar.iterator(); it.hasNext(); ) {
        String st = it.next();
        System.out.println("st="+st);
        if(st.equals("a")) {
            it.remove();
        }
    }
    
...