2016-07-16 6 views
2

Как мне решить ConcurrentModificationException из нижеуказанной программы. Мне нужен список, где первый элемент - "Znk", а затем отсортированный список, следующий за ним.Исключение с одновременной модификацией

Я понимаю, я получаю это, потому что добавляю и удаляю на одной и той же итерации. Но как мне решить эту проблему и получить желаемый результат.

public class ListSwapIndex { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     ArrayList<String> swapIndex = new ArrayList<String>(); 
     ArrayList<String> swapIndextemp = new ArrayList<String>(); 
     swapIndex.add("Ank"); 
     swapIndex.add("Znk"); 
     swapIndex.add("Bnk"); 
     swapIndex.add("Dnk"); 
     swapIndex.add("Enk"); 
     swapIndex.add("Lnk"); 

     for (String string : swapIndex) { 
      if(string.equals("Znk")){ 
       swapIndextemp.add(string); 
       swapIndex.remove(string); 
       }   
     } 
     swapIndextemp.addAll(swapIndex); 
     System.out.println(swapIndextemp); 

    } 

} 
+1

Нет, это потому, что вы одновременно изменяете массив. Вместо этого используйте вектор или синхронизированный arraylist. – Ioan

+0

См. [Это] (http://stackoverflow.com/questions/18448671/how-to-avoid-concurrentmodificationexception-while-removing-elements-from-arr) возможный дубликат «Невозможно архивировать с расширенным циклом» – malatesh

ответ

4

Нельзя изменять коллекцию одновременно с ее итерацией. Java защищает это, проверяя повторную сборку и быстро заканчивая при обнаружении модификации.

Используя ListIterator<T> вместо переборе с for -Каждая петли устраняет проблему, потому что список Итератор ArrayList позволяет делеции:

for (ListIterator<String> iter=swapIndex.listIterator(); iter.hasNext() ;) { 
    String current = iter.next(); 
    if(current.equals("Znk")){ 
     swapIndextemp.add(string); 
     iter.remove(); 
    } 
} 

Заметим, однако, что этот подход не является оптимальным, так как удаление из списка массива операция O (n), в результате чего общая производительность O (n). Вам было бы лучше повторить список дважды - один раз поставить все "Znk" s спереди, а еще раз поставить остальные предметы после него. Это дает вам общую производительность O (n).

+0

Спасибо ..Это работает для меня. Также ваше объяснение помогает увеличить производительность – themaster

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