2017-01-14 14 views
1

Humanオブジェクトで構成されたリストを保持するCountryクラスがあります。カントリークラスでは、次のような機能があります。リストを反復処理中にConcurrentModificationExceptionを回避する方法

public void processOneDay(int day, List<Country> countryList, int numberOfCountries){ 
     ListIterator<Human> iter = people.listIterator(); 
     while(iter.hasNext()){ 
      Human h = iter.next(); 
      h.move(day, countryList, numberOfCountries); 
     } 
    } 

人間クラスの移動()メソッドは、他の1つの国からのヒトの移動のための責任があるが、この方法は、ソースの国の人のリストからその人を削除し、目的地の国の人々のリストに追加されます。したがって、反復処理中にこの操作を実行すると、ConcurrentModificationExceptionが発生します。イテレーター自体のremove関数を使用しようとしましたが、もっと混乱しました。だから、どうやってこの状況に対処できますか?

答えて

0

リストのコピーを作成するだけで、このリストを繰り返し使用できます。

List<Human> copy = new ArrayList<Human>(people);

0

あなたが発見したとして、あなたは、あなたが反復されているリストを変更することはできませんので、2つの選択肢がありますが、どちらかは、リストのコピーを反復処理する必要がある、またはあなたは、リストをトラバースする必要がありますforループを使用して、リスト内の項目を直接索引付けします。

リストのコピーははるかに簡単ですが、リストが非常に大きい場合は、CPUサイクルとメモリが浪費されます。 for (var i = 0; i < list.Count; i++) list[i]を使用するともう少し複雑ですが、はるかに効率的です。リストからアイテムを削除する場合は、iを増分しないでください。

関連する問題