2012-07-17 10 views
7

¿Cómo se obtiene el mayor valor de un NSArray con diccionarios?¿Cómo obtener el mayor valor de los diccionarios que contienen NSArray?

Digamos que tengo NSArray que contiene diccionarios con claves "edad", "nombre", etc. Ahora quiero obtener el registro con la edad más alta. ¿Es esto posible con algo de magia de KVC? ¿O debo iterar y hacerlo de la manera "manual"?

He tratado con algo similar a esto:

int max = [[numbers valueForKeyPath:@"@max.intValue"] intValue]; 
+0

si necesita mayor valor de AGE ... @ utilización max.age – waheeda

+1

hombre, a veces me gustaría que tuviéramos algo como [LINQ] (http://en.wikipedia.org/wiki/Language_Integrated_Query) en Cacao .... – Jay

Respuesta

14

A menos que "intValue" sea una clave en su diccionario, la ruta de la clave no servirá de mucho.

Si es la edad máxima que debe buscar, debe usar @"@max.age" (en el diccionario) para obtenerla. Lo mismo ocurre con cualquier otra tecla en tu diccionario.

[myDictionary valueForKeyPath:@"@max.age"]; 

Si numbers es una matriz de valores que podría utilizar @"@max.self" como la ruta clave para obtener el valor más grande.

[myArrayOfNumbers valueForKeyPath:@"@max.self"]; 
+1

Estoy usando su segunda línea para obtener el elemento máximo de mi NSMutableArray (que contiene todos los objetos NSNumber dentro) y Recibo este error: *** Aplicación de finalización debido a la excepción no detectada 'NSUnKeyKeyException', razón: '[<__ NSCFNumber 0x1dd44bc0> valueForUndefinedKey:]: esta clase no es un valor clave que cumpla con la codificación para la clave max'. ¿Alguna idea de lo que está mal? – uerceg

+0

Lo siento. Supuse que se comportaría como NSPredicate y usar 'self' cuando no se especificara nada más. El segundo ejemplo correcto sería '[myArrayOfNumbers valueForKeyPath: @" @ max.self "];' (respuesta actualizada) –

+0

Pensé que propondrías esta solución, pero realmente es extraño que esta solución actualizada NO FUNCIONE para mí tampoco . Recibo el mismo mensaje de error como antes. – uerceg

1

estás muy cerca, sólo tiene que especificar el campo exacto que desea desde la que desea que el valor máximo:

NSInteger max = [[numbers valueForKeyPath:@"@max.age"] integerValue]; 

he tomado la libertad de modificar sus int s a NSInteger s, por si acaso alguien quiere utilizar este código en tanto para iOS y OS X.

+1

Esta es una muy buena respuesta :) y es lo suficientemente diferente de la respuesta aceptada para garantizar un voto positivo – Rambatino

Cuestiones relacionadas