Удаление дубликатов в nsarray

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

Может ли кто-нибудь вести меня, что я ошибаюсь

календарь сначала -

( 
2010-09-25 17:00:00 GMT,
"AAA",
2010-09-25 17:00:00 GMT,
"AAA",
2010-09-26 17:00:00 GMT,
"BBB",
2010-09-26 17:00:00 GMT,
"BBB",
2010-09-27 17:00:00 GMT,
"CCCC",
2010-09-27 17:00:00 GMT,
"CCC",
2010-09-28 17:00:00 GMT,
"AAA",
2010-09-28 17:00:00 GMT,
"AAA",
2010-09-29 17:00:00 GMT,
"DDDD",
2010-09-29 17:00:00 GMT,
"DDDD",
2010-09-30 17:00:00 GMT,
"BBBB"
)

мой код

NSArray dates; //dates contain above values
NSMutableArray *temp_date = [[NSMutableArray alloc] init];

for (int i=0; i<[dates count]; i+=2){
    BOOL day;

    if ([dates count]-2 >i) {
        day = [[dates objectAtIndex:i] compare:[dates objectAtIndex:i+2]];
    }   

    if (day) {
        [temp_date addObject:[dates objectAtIndex:i]];
        [temp_date addObject:[dates objectAtIndex:i+1] ];
    }
}

С уважением, Sathish

Ответ 1

Вы можете использовать наборы. Дубликаты будут удалены автоматически после создания.

NSArray *cleanedArray = [[NSSet setWithArray:dates] allObjects];

Помните, что набор неупорядочен.

В соответствии с комментарием Brent, более поздним решением проблемы, которая позволит вам сохранить элементы в порядке.

[[NSOrderedSet orderedSetWithArray:dates] array]

Ответ 2

Самый чистый путь

NSArray *noDuplicatesDates = [dates valueForKeyPath:@"@distinctUnionOfObjects.self"];

Ответ 3

Чтобы найти одинаковые объекты, лучше использовать –indexOfObjectIdenticalTo: или - indexOfObjectIdenticalTo:inRange:

Ответ 4

используйте это, если вы использовали mutableArray.

NSArray *copy = [mutableArray copy];

NSInteger index = [copy count] - 1;

for (id object in [copy reverseObjectEnumerator]) {

    if ([mutableArray indexOfObject:object inRange:NSMakeRange(0, index)] != NSNotFound) {
        [mutableArray removeObjectAtIndex:index];
    }
    index--;
}
[copy release];