2009-09-17 17 views
50

Tengo un NSArray formado con objetos de una clase personalizada. La clase tiene 3 propiedades de cadena (ciudad, estado, zip). Me gustaría obtener todos los valores de estado únicos del array.iPhone - obteniendo valores únicos del objeto NSArray

Lo leí a través de la clase NSPredicate pero no pude sacarle mucha información sobre cómo usarlo en este caso. Los únicos ejemplos que pude encontrar fueron para operaciones de cuerda.

¿Alguien puede ayudarme?

Respuesta

117

El totalmente sencilla un trazador de líneas:

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

El truco es el método valueForKey: de NSArray. Eso iterará a través de su matriz (myArrayOfCustomObjects), llame al método -state en cada objeto y construya una matriz de resultados. Luego creamos un NSSet con la matriz resultante de estados para eliminar duplicados.


A partir de iOS 5 y OS X 10.7, hay una nueva clase que puede hacer esto también: NSOrderedSet. La ventaja de un conjunto ordenado es que eliminará cualquier duplicado, pero también mantendrá el orden relativo.

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

Aunque también me gusta el poder de @distinctUnionOfObjects, y por lo tanto, el usuario respuesta probablyCorey dio, el beneficio de este enfoque concisa aquí en esta solución es que el orden se conserva. – idStar

134

Eche un vistazo a keypaths. Son muy poderosos y los uso en lugar de NSPredicate clases la mayoría del tiempo. Aquí es como se puede utilizar en tu ejemplo ...

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

Nota el uso de valueForKeyPath en lugar de valueForKey.

Aquí está un ejemplo más detallado/artificial ...

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

Advertencia: valueForKeyPath: @ "@ distinctUnionOfObjects.PROPERTY" no conserva el orden de clasificación. –

+0

gracias @RobertAltman, por señalar eso. Supongo que eso me ahorró un tiempo de depuración – Hulvej

+0

¿Qué pasa si el objeto a la clave es una matriz y el valor existe en el primer índice de la misma? –

Cuestiones relacionadas