2016-07-16 11 views
2

Wie löse ich ConcurrentModificationException aus dem folgenden Programm. Ich brauche eine Liste, wo das erste Element ist "Znk", und dann die Sortierung nach ihm aufgeführt.Gleichzeitiger Änderungsausnahme

Ich verstehe, ich bekomme das, weil ich in der gleichen Iteration hinzufügen und entfernen. Aber wie löse ich das und bekomme die gewünschte Ausgabe.

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

Nein, das liegt daran, dass Sie das Array gleichzeitig ändern. Verwenden Sie stattdessen einen Vektor oder eine synchronisierte Arraylist. – Ioan

+0

Siehe [dies] (http://stackoverflow.com/questions/18448671/how-to-avoid-concurrentmodificationexception-while-removing-elements-from-arr) möglich duplizieren "Kann nicht mit erweiterten For-Schleife archivieren" – malatesh

Antwort

4

Sie dürfen eine Sammlung nicht gleichzeitig mit der Iteration ändern. Java schützt davor, indem es die Sammlung überprüft, die iteriert wird, und schnell versagt, wenn eine Änderung gefunden wird.

Mit ListIterator<T> statt mit for -jeder Schleife iteriert behebt das Problem, weil die Liste Iterator von ArrayList Deletionen erlaubt:

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

Beachten Sie jedoch, dass dieser Ansatz nicht optimal ist, weil die Entfernung von einer Array-Liste ist eine O (n) -Operation, was zu einer Gesamtleistung von O (n) führt. Sie wären besser dran, die Liste zweimal zu wiederholen - einmal, um alle "Znk" s an die Front zu setzen, und noch einmal, um den Rest der Elemente danach zu setzen. Dies gibt Ihnen eine Gesamtleistung von O (n).

+0

Danke ..dies funktioniert für mich. Auch hilft Ihre Erklärung bei der Steigerung der Leistung – themaster

Verwandte Themen