iPhone SDK: как удалить дубликаты в NSArray - PullRequest
1 голос
/ 12 марта 2011

Привет, мой NSArray содержит подобные дубликаты (я должен удалить дубликаты)

заголовков: День отца

заголовков: День отца

заголовков: День отца

заголовков: День выборов

заголовков: День выборов

заголовков: День выборов

заголовков: Пасха

заголовков: Пасха

титулов: День Земли

титулов: День Земли

титулов: День Земли

титулов: Синко де Майо

титулов: Синко де Майо

заголовки: Cinco de Mayo

заголовки: сочельник

заголовки: сочельник

заголовки: сочельник

заголовки: новогодние заголовки:Рождественские названия: Рождество

У меня осталось только одно имя, а другие дубликаты не нужны.Как мне это сделать, пожалуйста, направьте меня с немного ясным объяснением, чтобы решить эту проблему.Спасибо.

Ответы [ 3 ]

7 голосов
/ 12 марта 2011

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

NSMutableArray *uniqueItems = [NSMutableArray array];
for (id item in allItems)
    if (![uniqueItems containsObject:item])
        [uniqueItems addObject:item];

Если нет, гораздо проще использовать набор:

NSSet *uniqueItems = [NSSet setWithArray:allItems];
2 голосов
/ 13 марта 2011

Ваш NSArray, который вы хотите дедуплировать, уже отсортирован? Похоже из твоего вопроса. В этом случае подойдет следующий код:

NSMutableArray *uniqueItems = [NSMutableArray array];

id lastSeenUniqueObject = nil;

for (NSObject *item in allItems) {
    if (![item isEqual:lastSeenUniqueObject]) {
        [uniqueItems addObject:item];
        lastSeenUniqueObject = item;
    }
}

Это имеет сложность времени выполнения N (то есть быстро) по сравнению с (приблизительно) N ^ 2 сложностью ответа rpetrich.

Если вы не знаете, что содержимое массива отсортировано, у вас есть два варианта:

A) просто отсортируйте его и затем примените вышеупомянутый алгоритм, который дает n log n сложность во время выполнения (все еще лучше, чем N ^ 2),

или

B) использовать NSMutableSet для отслеживания уже увиденных объектов (или любой другой структуры данных, которая использует сегменты и хеширование). Код будет выглядеть так:

NSMutableArray *uniqueItems = [NSMutableArray array];

NSMutableSet *seenItems = [NSMutableSet set];

for (NSObject *item in allItems) {
    if (![seenItems containsObject:item]) {
        [uniqueItems addObject:item];
        [seenItems addOBject:item];
    }
}

Это также дает время выполнения лучше, чем N ^ 2.

0 голосов
/ 12 марта 2011

Смотрите просто это ..

NSMutableArray *dateArray = [[NSMutableArray alloc]initWithObjects:@"December 29,2010", 
                             @"December 28,2010",
                             @"December 22,2010",
                             @"December 22,2010",
                             @"December 22,2010",@"December 21,2010",@"December 28,2010",nil];

для Avoid Duplicate используйте это ...

NSSet *cleanedArray = [NSSet setWithArray:dateArray];
NSArray *array = [[NSArray alloc]initWithArray:[cleanedArray allObjects]];

for (int i=0; i<[array count]; i++) {
    NSLog(@"The Given Array is %@",[array objectAtIndex:i]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...