ここで最初に注意すべきことは、すべてのループの最後に 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 は信じられないほど強力ですが、個人的には状況によっては非常に十分に活用されていません。