Подтвердить что ты не робот

IPhone - получение уникальных значений из объекта NSArray

У меня есть NSArray, образованный с объектами пользовательского класса. Класс имеет 3 строковых свойства (город, состояние, zip). Я хотел бы получить все уникальные значения состояния из array.

Я прочитал класс NSPredicate, но не смог много сделать, чтобы использовать его в этом случае. Единственные примеры, которые я мог найти, были для строковых операций.

Кто-нибудь может помочь мне?

4b9b3361

Ответ 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"