我发现了一些与此类似的代码(不完全只是复制了奇怪的逻辑):
for(int counter = 0 ; counter < array.length() ; counter ++ ) {
array.removeObjectAtIndex(i);
counter -- ;
}
这是不好的代码吗?应该怎么做假设没有原始方法来清空整个数组,或者我们需要在删除每个元素后做一些额外的清理工作?
答案 0 :(得分:4)
如果你从上到下,你将不需要counter--
,并且效率更高,因为每次调用removeObjectAtIndex
时都不必将数组元素移位。
答案 1 :(得分:2)
干扰循环体内的循环计数器绝不是一个好主意。
尽管不知道array
是什么,但更好的方法是连续删除数组头,直到数组为空。
int length = array.length();
for(int counter = 0 ; counter < length ; counter++ )
{
array.removeObjectAtIndex(0);
}
答案 2 :(得分:1)
嗯,首先要注意的是,在每个循环结束时,有一个counter++
和一个counter--
。有效地相互抵消。
我怀疑一位初级程序员被教导为循环需要格式
for(int i=0;i<len;i++) {/*code*/}
在这个逻辑上,由于数组在循环中每次传递时移动一个长度,他需要计数器也会减少(因为不会产生假结果)。
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));
因为它非常强大,我个人觉得它们在某些情况下使用率很低。
答案 3 :(得分:0)
我同意acraig5075关于干扰循环体内循环计数器的评论是不好的habbit
我认为自下而上的方法如下代码将正常工作
for(int counter = array.length - 1; counter >= 0; counter--)
{
array.removeObjectAtIndex(counter);
}