3

私は次のようなforループを持っています

      for (int neighbour : neighbours) {

neighboursループ内で変更できる場所。それがの原因であることがわかりましたConcurrentModificationExceptionそしてhttps://stackoverflow.com/a/8189527/292291から読んでください

したがって、リスト(または一般的なコレクション)を変更する場合は、 イテレーターを使用します。これは、変更を認識しているため、それらが適切に処理されるためです。

だから私は試しました:

neighboursItr = neighbours.iterator();
while (neighboursItr.hasNext()) {
  // try disconnecting vertices
  neighbour = neighboursItr.next();

しかし、それでは問題は解決しません。なんで?

4

4 に答える 4

11

呼んでいneightbours.remove(neighbour)ますか?その場合、それが問題です。neightboursItr.remove()代わりに電話する必要があります。

于 2012-09-24T09:51:53.270 に答える
1

HashSet希望の状態で新しいものを作成することを検討しましたか?つまり、を繰り返し処理して、必要なものneighboursに追加することができnewNeighboursます。

于 2012-09-24T09:52:26.697 に答える
1

コレクションを反復処理している間は、イテレータのメソッドを使用してのみコレクションを変更できます。したがって、を呼び出すことはできますが、たとえば、をneighboursItr.remove()使用してコレクションに要素を追加することはできません。neighbours.add()

于 2012-09-24T09:52:32.927 に答える
1

反復中にコレクションを変更することはできません。唯一の例外は、iterator.remove()メソッドの使用です(ターゲットコレクションでサポートされている場合)。

その理由は、これがイテレータの動作方法であるためです。コレクションの次の要素にジャンプする方法を知っている必要があります。イテレータの作成後にコレクションが変更されている場合、コレクションはこれを行うことができず、例外をスローします。

この問題にはいくつかの解決策があります。たとえば、反復中に既存のコレクションに要素を追加する場合は、新しい要素を格納する別のコレクションを作成し、反復の終了後にこれらすべての要素を追加できます。

于 2012-09-24T09:56:33.047 に答える