-1

これに似たコードをいくつか見つけました(奇妙なロジックが複製されただけではありません):

for(int counter = 0 ; counter < array.length() ; counter ++ ) {
    array.removeObjectAtIndex(i);
    counter -- ;
}

これは悪いコードですか?配列全体を空にするプリミティブな方法がない、または各要素を削除した後に追加のクリーンアップを行う必要があると仮定すると、どうすればよいでしょうか?

4

4 に答える 4

4

上から下に行けば、 は必要なく、が呼び出されるcounter--たびに上の配列要素をシフトする必要がないため、より効率的です。removeObjectAtIndex

于 2013-01-17T06:15:55.050 に答える
2

ループ本体内のループ カウンターに干渉することは、決して良い考えではありません。

何が何でarrayあるかはわかりませんが、アレイが空になるまでアレイヘッドを継続的に削除することをお勧めします。

int length = array.length();
for(int counter = 0 ; counter < length ; counter++ )
{
    array.removeObjectAtIndex(0);
}
于 2013-01-17T06:12:12.590 に答える
1

ここで最初に注意すべきことは、すべてのループの最後に acounter++と aがあることcounter--です。互いに効果的に打ち消し合う。

ジュニア プログラマーが for ループには次の形式が必要であると教えられたのではないかと思います。

for(int i=0;i<len;i++) {/*code*/}

そのロジックに進むと、配列の長さがループ内のパスごとに 1 ずつシフトするため、カウンターもデクリメントする必要がありました (偽の結果を生成しないようにするため)。

for(int c=0;c<a.length();c++){a.remove(i);c--;}

この実装から削除するc--と、インデックスの半分だけが削除されます。長さが下がるとカウンターが上がり、効果的に途中で出会います。

硬直性が低いと感じる別の実装

for(;array.length()>0;){array.removeObjectAtIndex(i);}
// also this
for(;array.length();array.removeObjectAtIndex(i));

言及されたOPは.length()非効率的かもしれないので:

for(int len=array.length();len--;array.removeObjectAtIndex(i));

For は信じられないほど強力ですが、個人的には状況によっては非常に十分に活用されていません。

于 2013-01-17T08:04:22.397 に答える
0

ループ本体内のループカウンターに干渉することについてのacraig5075のコメントは悪い習慣であることに同意します

以下のコードのようなボトムアップアプローチはうまくいくと思います

for(int counter = array.length - 1; counter >= 0; counter--)
{
      array.removeObjectAtIndex(counter);
}
于 2013-01-17T06:53:18.730 に答える