Какао - удаление / удаление элементов при разборе NSMutableArray - PullRequest
1 голос
/ 12 августа 2011

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

Как я могу сделать это без двух (или более) массивов для процесса?

Для тех, у кого возникнет искушение сказать: «Эй, просто невозможно проанализировать И удалить объекты из массива, я просто могу сказать, что когда я анализирую ящик, из которого хочу удалить устаревшие лекарства, я не есть проблема, чтобы сделать это ... Когда я нахожу один, я удаляю это, тогда я ищу следующую аптечку, чтобы проверить. Мне не нужен второй ящик.

Ответы [ 6 ]

6 голосов
/ 12 августа 2011

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

for (NSInteger i = arrayCount - 1; i >= 0; i--) {
    // remove is OK here
}
2 голосов
/ 12 августа 2011

Если у вас есть 2 массива.Оба типа NSMUtableArray.Вы можете просто сделать -

[mainArray removeObjectsInArray:toRemoveObjects];

1 голос
/ 12 августа 2011

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

0 голосов
/ 15 августа 2011

Я нашел супер элегантное решение, которое работает с 2-мя массивами, хорошо, но это мешает сделать цикл синтаксического анализа во многих ситуациях;

NSArray* matchingItems = [mainArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@" attributetockeck MATCHES[cd] %@ ", attributevalue]];
[mainArray removeObjectsInArray:matchingItems];
0 голосов
/ 15 августа 2011

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

[mainArray removeObject:objectToRemove];
0 голосов
/ 12 августа 2011
for( NSUInter i = 0, j = 0; i < array.count; i++ )
{
    if( test )
        [array removeObjectAtIndex:j];
    else
        j++;
}

Вот код в версии командной строки, которую вы можете запустить и проверить самостоятельно, она удаляет каждое нечетное число

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{

    NSAutoreleasePool       * pool = [[NSAutoreleasePool alloc] init];
    NSMutableArray          * array = [NSMutableArray array];

    for( NSUInteger i = 0; i < 20; i++ )
        [array addObject:[NSNumber numberWithInteger:random()%100]];


    NSLog( @"%@", array );

    for( NSUInteger i = 0, j = 0; i < array.count; i++ )
    {
        if( [[array objectAtIndex:j] unsignedIntegerValue] & 1 )
            [array removeObjectAtIndex:j];
        else
            j++;
    }   

    NSLog( @"%@", array );

    [pool drain];
    return 0;
}
...