итерировать список и удалять элементы из него в target-c? - PullRequest
2 голосов
/ 19 декабря 2010

Objective-c имеет встроенный итератор списка через синтаксис for (a in b), который отлично работает с NSArray и другими коллекциями. Но возможно ли удалить элементы во время такой итерации без таких уродливых уловок, как

for( int i = 0, i < [array count]; i ++ )
{
  if( condition )
  {
    [array removeItemAtIndex : i];
    i --;
  }
}

Ответы [ 4 ]

14 голосов
/ 19 декабря 2010

Вы можете выполнять итерацию массива в обратном порядке, поэтому вам не нужно дополнительно настраивать индекс:

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

Или накапливать индексы для удаления в наборе индексов при перечислении, а затем удалять все элементы сразу:

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

Я бы выбрал 2-й вариант, потому что изменение массива при перечислении может быть не очень хорошим стилем (хотя в данном конкретном случае это не даст вам ошибок)

3 голосов
/ 19 декабря 2010

Нет, изменение коллекции при ее перечислении явно запрещено.Вы можете добавить объекты, которые должны быть удалены, во второй временный изменяемый массив, а затем, вне цикла, удалить объекты в этом массиве из оригинала с помощью removeObjectsInArray:.

2 голосов
/ 19 декабря 2010

Я бы не назвал это грязным трюком, чтобы перебирать массив обратно. for (int i = array.count-1; i> = 0; i--) если (условие) [array removeItemAtIndex: i];

1 голос
/ 19 декабря 2010

Если мне это нужно, я копирую свой массив и перечисляю один, пока другой мутирует

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

но я думаю, что пример Владимира лучше;) (просто чтобы иметь все возможности)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...