0

これにより、予期しない動作が発生しますか?

 ArrayList<X> x = new ArrayList<>();
 //x.add(new X())...
f:
for(int i = 0; i < x.size() -1;)
{
      X y = x.get(i);
      for(int j = i + 1; j < x.size();)
       {
          if(a) {
           x.remove(j);
           continue;
          }
          if(b) {
           x.remove(i);
           continue f;
          }
          j++;
        }
       i++;
}
4

3 に答える 3

1

array削除するインデックスを含むを作成することをお勧めします。そして、メインforサイクルでインデックスを埋めます。次のようなことができます:

Collections.sort(indexesToRemoveArr);
Collections.reverse(indexesToRemoveArr);
for (int indexToRemove : indexesToRemoveArr) {
     arr.remove((int) indexToRemove );
}

そのコードでは、インデックスを最初から最後まで削除します。そのため、問題は発生しません。

于 2012-10-07T03:27:27.540 に答える
1

予測できないとは思いませんが、あなたのスタイルは私には間違っているように見えるので、あなたのアプローチは疑わしいです.

ラベルを使用することは悪い考えであり、それを使用することを決定すると、あなたのアプローチに欠陥があることがわかります.

ArrayList での削除に関するこの議論を見たいと思うかもしれませんが、基本的に LinkedList は fsster になります:

http://www.velocityreviews.com/forums/t587893-best-way-to-loop-through-arraylist-and-remove-elements-on-the-way.html

ただし、この方法を削除すると機能します。

アップデート:

おっと、いくつかのバグが見つかりました:

      if(a) {
       x.remove(j);
       continue;
      }

OK、これで j のループに戻りますが、j をインクリメントしませんでした。

      if(b) {
       x.remove(i);
       continue f;
      }

これはiも同じです。

したがって、それを修正するには同様の変更が必要です。

for(int i = 0; i < x.size() -1; i++)

このように、ヒットcontinueしても次の要素に移動します。

于 2012-10-07T02:37:13.013 に答える
0

はい。コンパイラは x.size() を最適化して 1 回だけ呼び出します。そのため、要素を削除するとすぐに終了条件が正しくなくなります。

于 2012-10-07T03:18:36.530 に答える