2009-06-11 18 views

答えて

1

実際には言語によって異なります。配列を突き抜けたり、配列を変更したりすると爆発する人もいます。いくつかは配列を使用し、爆発しません。あるものは、イテレータを呼び出すもの(完全に頑強なもの)もあります。

3

位置情報を正しく維持するためにコレクションの変更を追跡する列挙子をサポートするために、かなり洗練されたコレクションを使用できます。たとえそれがいくつかの妥協または仮定を行う必要があるとしても。そのため、ほとんどの図書館では、予期せぬ挙動について、そのようなことを禁止しています。

したがって、最も安全なアプローチはループすることです。削除が必要なものへの参照を収集し、その後、収集された参照を使用して元のコレクションからアイテムを削除します。

0

foreachの概念を理解する必要があります。実際には、プログラミング言語に依存します。しかし、一般的な答えとしてforeach内のコレクションを変更しないようにしてください

1

一般的に、foreachループ内のコレクションを変更することは、あなたの意図がプログラムには分かっていないため、悪い考えです。変更前にすべての項目をループすることを意味しましたか、それとも単に新しい設定を使用したいのですか?既にループされているアイテムはどうですか?

代わりに、コレクションを変更する場合は、ループスルーするアイテムの事前定義リストを作成するか、インデックス付きループを使用します。

1

ハッシュテーブルや辞書などの一部のコレクションには、「位置」の概念はなく、繰り返しの順序は一般的に保証されません。したがって、反復処理中に項目の削除を許可することは非常に困難です。

0

標準のforループを使用して、アイテムコレクションを逆順に繰り返します。移動するときにアイテムを削除するには問題ありません。

0

逆順に繰り返して項目を1つずつ削除してください...これは適切な解決策です。

0

いいえ、そうしないでください。正しい動作は、潜在的な並行性の問題が発生したことを通知することですが、これは選択した言語(例外をスローし、エラーコードを返し、シグナルを発生させます)で行われます。

要素の反復処理中にデータ構造を変更した場合、イテレータは無効になる可能性があります。つまり、コレクションに含まれていないオブジェクトで作業するリスクがあります。あなたはイテレータを使用することを反復しているコレクションから項目を削除するための最良の方法

List<T> toFilter = ...; 
List<T> shadow; 
for (T element : toFilter) 
    if (keep(element)) 
     shadow.add(element); 

/* If you'll work with toFilter in the same context as the filter */ 
toFilter = shadow; 

/* Alternatively, if you want to modify toFilter in place, for instance if it's 
* been given as a method parameter 
*/ 
toFilter.clear(); 
toFilter.addAll(shadow); 
0

:あなたはいくつかのより複雑な表記法に基づく要素をフィルタリングしたい場合は、この(Javaで)のような何かを行うことができます明らかに。例えば。

List<String> myList = ArrayList<String>(); 
Iterator<String> myIt = myList.iterator(); 

while (myIt.hasNext()) { 
    myIt.remove(); 
} 
関連する問題