2

注意: doSomething が要素を削除するかどうかはわかりません。これは、私のデータ構造が処理する必要がある例外的なケースです。

私の問題は単純です:

int size = list.size();
for(int i = 0; i < size; i++) {
   MyObj mo = list.get(i);
   mo.doSomething();
}

doSomething() がリストから mo を削除すると、リストが縮小したため、最終的に ArrayIndexOutOfBounds を取得します。

削除の可能性がある反復を許可するには、どのデータ構造を使用する必要がありますか? ここでは反復子を使用できません。つまり、doSomething にブール値を返させて iterator.remove() を呼び出すことはできません。データ構造は何らかの方法で状況を処理し、残りの要素を反復処理し続ける必要があります。

編集: doSomething が要素を削除するかどうかはわかりません。これは、私のデータ構造が処理する必要がある例外的なケースです。

パート II =>どこでもコードの重複を避けるためのスマート リスナー通知機能の作成

4

3 に答える 3

3

ArrayListたとえば、何かが削除されたときにインデックスとサイズを更新する限り、を使用できます。

List<MyObj> list = new ArrayList<MyObj>();
int size = list.size();
for(int i = 0; i < size; i++) {
    MyObj mo = list.get(i);
    mo.doSomething();
    if (size > list.size()) {
        size = list.size();
        i--;
    }
}

これは、削除されたアイテムが最後に検査されたアイテムである場合にのみ機能します。リストに対するその他の変更については、より複雑なロジックが必要になります。

于 2012-08-24T22:11:05.283 に答える
2

削除の可能性がある反復を許可するには、どのデータ構造を使用する必要がありますか?

最も簡単なオプションは、リストのコピーを取得し、代わりにそれを反復処理することです。

List<MyObj> copy = new ArrayList<MyObj>(list);
for (MyObj mo : copy) {
    mo.doSomething();
}

元のリストからアイデアが削除されるかどうかは問題ではありません。リストのコピーは変更されません。

別のオプションは、を使用することCopyOnWriteArrayListです。その後、アイテムを自由に繰り返して削除または追加できます。

「スナップショット」スタイルの反復子メソッドは、反復子が作成された時点での配列の状態への参照を使用します。この配列は反復子の有効期間中に変更されることはないため、干渉は不可能であり、反復子は ConcurrentModificationException をスローしないことが保証されています。イテレータは、イテレータが作成されてからのリストへの追加、削除、または変更を反映しません。

于 2012-08-24T22:17:47.967 に答える
0

私はあなたがあなたを変えるべきだと思いますdoSomething()。からmo.doSomething()削除できる場合は、.molmol

次のようにコードを変更できます。

MyObj 内に有効なフラグを作成します。有効な場合にのみリッスンします。

while(list.hasNext()) {
   MyObj mo = list.next()
   if(mo.isValid()){
       mo.doSomething();
   } else {
       list.remove();
   }
}
于 2012-08-24T22:25:56.967 に答える