2009-09-17 13 views
50

Mam obiekt NSArray utworzony z obiektów klasy niestandardowej. Klasa ma 3 właściwości łańcucha (miasto, stan, zip). Chciałbym uzyskać wszystkie unikalne wartości stanu z array.iPhone - uzyskiwanie unikatowych wartości z obiektu NSArray

Przeczytałem klasę NSPredicate, ale nie mogłem zrobić wiele, jak go używać w tym przypadku. Jedyne przykłady, jakie mogłem znaleźć, dotyczyły operacji na łańcuchach.

Czy ktoś może mi pomóc?

Odpowiedz

117

Całkowicie prosty wewnętrzny:

NSSet *uniqueStates = [NSSet setWithArray:[myArrayOfCustomObjects valueForKey:@"state"]]; 

Trick jest sposób NSArrayvalueForKey:. To będzie iterować przez twoją tablicę (myArrayOfCustomObjects), wywołaj metodę -state dla każdego obiektu i zbuduj tablicę wyników. Następnie tworzymy NSSet z wynikową tablicą stanów, aby usunąć duplikaty.


Wychodząc z iOS 5 i OS X 10.7, nowe klasy, które mogą to zrobić również: NSOrderedSet. Zaletą uporządkowanego zestawu jest to, że usunie on wszystkie duplikaty, ale zachowa także względną kolejność.

NSArray *states = [myArrayOfCustomObjects valueForKey:@"state"]; 
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:states]; 
NSSet *uniqueStates = [orderedSet set]; 
+0

Chociaż lubię też moc @distinctUnionOfObjects, a zatem użytkownik odpowiedzi probablyCorey dał, z korzyścią dla tej zwięzłej podejścia tutaj w tym roztworze czy to zamówienie zostało zachowane. – idStar

134

Spójrz na keypaths. Są bardzo potężne i używam ich zamiast klas NSPredicate przez większość czasu. Oto jak można wykorzystać je w swoim przykładzie ...

NSArray *uniqueStates; 
uniqueStates = [customObjects valueForKeyPath:@"@distinctUnionOfObjects.state"]; 

Uwaga wykorzystanie valueForKeyPath zamiast valueForKey.

Oto bardziej szczegółowy/wymyślony przykład ...

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" 
+17

Zastrzeżenie: valueForKeyPath: @ "@ distinctUnionOfObjects.PROPERTY" nie zachowuje porządku sortowania. –

+0

dzięki @RobertAltman za wskazanie tego. Sądzę, że zaoszczędziło mi to trochę czasu na debugowanie. – Hulvej

+0

Co się stanie, jeśli obiektem klucza jest tablica, a wartość istnieje na pierwszym indeksie? –

Powiązane problemy