2009-09-17 10 views
50

J'ai un NSArray formé d'objets d'une classe personnalisée. La classe a 3 propriétés de chaîne (ville, état, zip). Je voudrais obtenir toutes les valeurs d'état uniques du array.iPhone - obtention de valeurs uniques à partir de l'objet NSArray

J'ai lu la classe NSPredicate mais je ne pouvais pas faire grand-chose pour l'utiliser dans ce cas. Les seuls exemples que j'ai pu trouver étaient pour les opérations de cordes.

Quelqu'un peut-il m'aider s'il vous plaît?

Répondre

117

Le tout simple doublure:

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

L'astuce est la méthode valueForKey: de NSArray. Cela parcourra votre tableau (myArrayOfCustomObjects), appellera la méthode -state sur chaque objet et construira un tableau des résultats. Nous créons ensuite un NSSet avec le tableau d'états résultant pour supprimer les doublons.


A partir de iOS 5 et Mac OS X 10.7, il y a une nouvelle classe qui peut le faire aussi bien: NSOrderedSet. L'avantage d'un ensemble ordonné est qu'il supprime tous les doublons, mais maintient également l'ordre relatif.

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

Alors que je aime aussi le pouvoir de @distinctUnionOfObjects, et par conséquent, l'utilisateur réponse probablyCorey a donné, l'avantage de cette approche concise dans cette solution Cet ordre est-il conservé? – idStar

134

Jetez un coup d'œil à keypaths. Ils sont super puissants et je les utilise à la place des classes NSPredicate la plupart du temps. Voici comment vous les utiliser dans votre exemple ...

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

Notez l'utilisation de valueForKeyPath au lieu de valueForKey.

Voici un exemple plus détaillé/... artificiel

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

Avertissement: valueForKeyPath: @ "@ distinctUnionOfObjects.PROPERTY" ne conserve pas l'ordre de tri. –

+0

merci @RobertAltman, pour le signaler. Je suppose que cela m'a sauvé du temps de débogage – Hulvej

+0

Que faire si l'objet à clé est un tableau et la valeur existe sur le premier index de celui-ci? –

Questions connexes