Ваш 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.