Во-первых, я бы переопределил isEqual: метод для Актива следующим образом:
-(BOOL)isEqual:(Asset *)otherAsset {
return [self.title isEqual:otherAsset.title] && [self.author isEqual:otherAsset.author];
}
Тогда, если вы хотите избежать размещения дубликатов в массиве, сначала:
NSUInteger idx = [items indexOfObject:asset]; // tests objects for equality using isEqual:
if (idx == NSNotFound) [items addObject:asset];
Если массив уже содержит дубликаты, то любой алгоритм, который находит их, имеет время выполнения уже хуже линейного, но я думаю, что создание нового массива и добавление только уникальных элементов, как указано выше, является лучшим алгоритмом. Примерно так:
NSMutableArray *itemsWithUniqueElements = [NSMutableArray arrayWithCapacity:[items count]];
for (Asset *anAsset in items) {
if ([items indexOfObject:anAsset] == NSNotFound)
[itemsWithUniqueElements addObject:anAsset];
}
[items release];
items = [itemsWithUniqueElements retain];
В худшем случае (все элементы уже уникальны) количество итераций равно:
1 + 2 + 3 + ... + n = n * (n+1) / 2
Что по-прежнему равно O (n ^ 2), но немного лучше, чем алгоритм @Justin Meiners. Без обид! :)