迭代列表并从objective-c中删除它的项目?

时间:2010-12-18 22:40:28

标签: objective-c

Objective-c有一个内置的列表迭代器,通过'for(a in b)语法,可以与NSArray和其他集合一起使用。但是在没有像

这样的丑陋技巧的情况下,可以在这样的迭代中删除项目
for( int i = 0, i < [array count]; i ++ )
{
  if( condition )
  {
    [array removeItemAtIndex : i];
    i --;
  }
}

4 个答案:

答案 0 :(得分:14)

您可以按相反的顺序迭代数组,这样您就不需要额外调整索引:

for( int i = [array count]-1; i >=0; --i)
{
   if( condition )
   {
      [array removeItemAtIndex : i];
   }
}

或者在枚举时累积要在indexset中删除的索引,然后一次删除所有元素:

NSMutableIndexSet *indexes = [[NSMutableIndexSet alloc] init];
for( int i = 0, i < [array count]; i ++ )
{
  if( condition )
  {
    [indexes addIndex : i];
  }
}
[array removeObjectsAtIndexes:indexes];
[indexes release];

我会选择第二个选项,因为在枚举时更改数组可能不是一个好的风格(虽然在这种特殊情况下它不会给你错误)

答案 1 :(得分:3)

不,明确禁止在枚举时改变集合。您可以将应删除的对象添加到第二个临时可变数组中,然后在循环外部使用removeObjectsInArray:从原始数据中删除该数组中的对象。

答案 2 :(得分:2)

我不会把它称为一个肮脏的技巧来向后遍历数组。 for(int i = array.count-1; i&gt; = 0; i--)   如果(条件)      [array removeItemAtIndex:i];

答案 3 :(得分:1)

如果我需要它,我复制我的数组并枚举一个而另一个是变异

NSArray *arr = firstArr;
for( int i = [array count]-1, i >=0; --i)
{
   if( condition )
   {
      [firstArr removeItemAtIndex : i];
   }
}

但我认为弗拉基米尔的例子是更好的例子;)(只是为了拥有所有可能性)