IPhone - получение уникальных значений из объекта NSArray
У меня есть NSArray
, образованный с объектами пользовательского класса. Класс имеет 3 строковых свойства (город, состояние, zip). Я хотел бы получить все уникальные значения состояния из array
.
Я прочитал класс NSPredicate
, но не смог много сделать, чтобы использовать его в этом случае. Единственные примеры, которые я мог найти, были для строковых операций.
Кто-нибудь может помочь мне?
Ответы
Ответ 1
Совершенно простой один вкладыш:
NSSet *uniqueStates = [NSSet setWithArray:[myArrayOfCustomObjects valueForKey:@"state"]];
Трюк - это метод valueForKey:
NSArray
. Это приведет к итерации через ваш массив (myArrayOfCustomObjects
), вызовет метод -state
для каждого объекта и построит массив результатов. Затем мы создаем NSSet
с результирующим массивом состояний для удаления дубликатов.
Начиная с iOS 5 и OS X 10.7, есть новый класс, который также может это сделать: NSOrderedSet
. Преимуществом упорядоченного набора является то, что он удалит любые дубликаты, но также сохранит относительный порядок.
NSArray *states = [myArrayOfCustomObjects valueForKey:@"state"];
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:states];
NSSet *uniqueStates = [orderedSet set];
Ответ 2
Посмотрите keypaths. Они очень мощные, и я использую их вместо классов NSPredicate большую часть времени. Вот как вы могли бы использовать их в своем примере...
NSArray *uniqueStates;
uniqueStates = [customObjects valueForKeyPath:@"@distinctUnionOfObjects.state"];
Обратите внимание на использование valueForKeyPath вместо valueForKey.
Вот более подробный/надуманный пример...
NSDictionary *arnold = [NSDictionary dictionaryWithObjectsAndKeys:@"arnold", @"name", @"california", @"state", nil];
NSDictionary *jimmy = [NSDictionary dictionaryWithObjectsAndKeys:@"jimmy", @"name", @"new york", @"state", nil];
NSDictionary *henry = [NSDictionary dictionaryWithObjectsAndKeys:@"henry", @"name", @"michigan", @"state", nil];
NSDictionary *woz = [NSDictionary dictionaryWithObjectsAndKeys:@"woz", @"name", @"california", @"state", nil];
NSArray *people = [NSArray arrayWithObjects:arnold, jimmy, henry, woz, nil];
NSLog(@"Unique States:\n %@", [people valueForKeyPath:@"@distinctUnionOfObjects.state"]);
// OUTPUT
// Unique States:
// "california",
// "michigan",
// "new york"