使用for循环从数组中删除对象

时间:2013-01-17 06:04:47

标签: c arrays algorithm

我发现了一些与此类似的代码(不完全只是复制了奇怪的逻辑):

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

这是不好的代码吗?应该怎么做假设没有原始方法来清空整个数组,或者我们需要在删除每个元素后做一些额外的清理工作?

4 个答案:

答案 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);
}