Первоначально я думал, что вы можете сделать:
NSArray * a = [NSArray arrayWithObjects:@"ONE", @"ONE", @"ONE", @"TWO", @"THREE", @"THREE", nil];
NSLog(@"%@", [a valueForKeyPath:@"@distinctUnionOfObjects.self"]);
Но это не поддерживает порядок.Следовательно, вы должны сделать это вручную:
NSArray * a = [NSArray arrayWithObjects:@"ONE", @"ONE", @"ONE", @"TWO", @"THREE", @"THREE", nil];
NSMutableArray * unique = [NSMutableArray array];
NSMutableSet * processed = [NSMutableSet set];
for (NSString * string in a) {
if ([processed containsObject:string] == NO) {
[unique addObject:string];
[processed addObject:string];
}
}
Я использую NSMutableSet
для определения того, встречал ли я эту запись ранее (в отличие от [unique containsObject:string]
, поскольку в наборе будет O(1) время поиска, а массив имеет время поиска O (n). Если вы имеете дело только с небольшим количеством объектов, то это не имеет значения. Однако, если исходный массив очень большой, используйтеустановка для определения уникальности может добавить некоторое повышение скорости (однако вы должны использовать инструменты для профилирования своего кода и проверки необходимости)