55 votes

iPhone - prise en valeurs uniques de NSArray objet

J'ai un NSArray formé avec des objets d'une classe personnalisée. La classe 3 (ville, état, code postal) les propriétés de la chaîne. Je voudrais obtenir tous unique de valeurs d'état de l' array.

Je n'ai lu par l' NSPredicate classe, mais n'a pas beaucoup de comment l'utiliser dans ce cas. Les seuls exemples que j'ai pu trouver étaient pour les opérations de la chaîne.

Quelqu'un peut-il m'aider?

136voto

probablyCorey Points 1741

Jetez un oeil à keypaths. Ils sont super puissants et je les utilise à la place de NSPredicate classes, la plupart du temps. Voici comment vous pourriez les utiliser dans votre exemple...

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

Notez l'utilisation de valueForKeyPath au lieu de valueForKey.

Plus en détail, voici/exemple 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"

122voto

Dave DeLong Points 156978

Le totalement simple liner:

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

Le truc, c'est le valueForKey: méthode de NSArray. Que va parcourir votre tableau (myArrayOfCustomObjects), l'appel de l' -state méthode sur chaque objet, et de construire un tableau de résultats. Nous créons ensuite un NSSet avec le tableau des états de supprimer les doublons.


À partir de l'iOS 5 et mac OS X 10.7, il y a une nouvelle classe qui peut faire cela ainsi: NSOrderedSet. L'avantage d'un ensemble ordonné est qu'il va supprimer tous les doublons, mais aussi de maintenir l'ordre.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X