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

参照[this](http://stackoverflow.com/questions/18448671/how-to-avoid-concurrentmodificationexception-while-removing-elements-from-arr)重複可能性「拡張forループでアーカイブできません」 – malatesh

答えて

4

コレクションを反復して同時に変更することはできません。 Javaは反復されているコレクションをチェックし、変更が見つかるとすぐに失敗することからこれを防ぎます。 ArrayListのリストイテレータは、欠失を可能にするので

ListIterator<T>を使用する代わりにfor - 各ループで繰り返すが、問題を修正:配列リストから除去であるので、このアプローチは、準最適であることが

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 )の全体的なパフォーマンスをもたらします。リストを2回反復する方が良いでしょう。一度すべて"Znk"を前面に置き、もう一度それ以降のアイテムを置く方が良いでしょう。これにより、O(n)の全体的なパフォーマンスが得られます。

+0

ありがとう..これは私のために働く。また、あなたの説明はパフォーマンスを向上させるのに役立ちます – themaster

関連する問題