-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,因此他也需要 counter 递减(为了不产生假结果)。

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's 非常强大,我个人发现它们在某些情况下被充分利用。

于 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 回答