2010-03-27 3 views
0

У меня есть изменяемый массив, который содержит изменяемые словари со строками для ключей широты, долготы и id. Некоторые значения широты и долготы одинаковы, и я хочу удалить дубликаты из массива, поэтому у меня есть только один объект для каждого местоположения.Cocoa - Перечислить изменяемый массив, удаляя объекты

Я могу перечислить свой массив и использовать второй перечислительный просмотр каждого объекта для поиска объектов с разными идентификаторами, но с той же широтой и долготой, но если я попытаюсь удалить объект, я буду мутировать массив во время перечисления.

Есть ли способ удалить объекты из массива при перечислении, поэтому я перечисляю только текущий набор объектов по мере обновления массива?

Надеюсь, что этот вопрос имеет смысл.

Спасибо, Howie

ответ

5

Прикинь индексной переменной, как вы перечислить. Когда вы заходите на словарь, который вам интересен, добавьте его индекс в mutable index set. Затем, когда вы закончите перечисление, отправьте массив a removeObjectsAtIndexes: message, передав индексный набор.

Другой способ заключается в создании второго массива, затем отправьте первый массив сообщение setArray:, передав второй массив или отпустите первый, сохраните второй и установите второй как новый.

Что касается несвязанной ноты, вы можете подумать о замене словарей на model objects. Он имеет тенденцию делать более чистый код.

+0

Спасибо за совет - я на самом деле пытался что-то вроде этого, но есть проблема. Если я нахожусь в индексе 3, и я нахожу, что он имеет то же место, что и индекс 4, я бы добавил индекс 4 в массив «для удаления». Когда я повторяю цикл для следующей итерации, я хочу, чтобы объект с индексом 4 был пропущен, так как я уже знаю, что это дубликат. Есть ли способ удалить объекты из исходного массива, как я перечисляю или используя какой-либо другой метод петлирования? – Ward

+0

Уорд, ни один из методов, предложенных Петром, не имеет проблемы, которые вы описываете. Тем не менее, есть простой способ избежать этого, если вы хотите делать что-то вручную: перебирать объекты, которые нужно удалить с самого высокого индекса до самого низкого. –

+0

Уорд: Нет, вы не можете мутировать массив, пока вы его перечисляете. Это приведет к исключению какао. Вы должны либо изменить его, либо заменить его * после * цикла или петли на копии. Я рекомендую решение 'removeObjectsAtIndexes:'. –

2

На самом деле вы можете. Вам нужно перейти от верхнего индекса 0. Попробуйте это:

for (int i = [mutableArray count] -1; i >=0; i--) { 
    id yourObject = [mutableArray objectAtIndex: i]; 
    BOOL needToDelete; 
    // place you conditions here... 

    if (needToDelete) { 
     [mutableArray removeObject: yourObject]; 
    } 
} 
+0

Могу ли я использовать для этого reverseObjectEnumerator? – Vyacheslav

+0

Да, вы можете. Я только что протестировал его с помощью reverseObjectEnumerator, и он отлично работает. –

Смежные вопросы