web-dev-qa-db-fra.com

iPhone - obtenir des valeurs uniques de l'objet NSArray

J'ai un NSArray formé avec des 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.

J'ai lu la classe NSPredicate mais je ne savais pas comment l'utiliser dans ce cas. Les seuls exemples que j'ai pu trouver étaient pour les opérations de chaîne.

Quelqu'un peut-il m'aider?

55
lostInTransit

La doublure totalement simple:

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

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


À partir d'iOS 5 et d'OS X 10.7, une nouvelle classe peut également le faire: NSOrderedSet. L'avantage d'un ensemble ordonné est qu'il supprimera tous les doublons, mais maintiendra également l'ordre relatif.

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

Jetez un oeil à keypaths . Ils sont super puissants et je les utilise la plupart du temps à la place des classes NSPredicate. Voici comment vous les utiliseriez 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"
136
probablyCorey