2012-07-17 17 views
7

Come si ottiene il massimo valore da un NSArray con i dizionari?Come ottenere il massimo valore dai dizionari contenenti NSArray?

Diciamo che ho NSArray contenente dizionari con le chiavi "età", "nome", ecc. Ora voglio ottenere il record con l'età più alta. E 'possibile con qualche magia KVC? O devo scorrere e farlo in modo "manuale"?

Ho provato con qualcosa di simile a questo:

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

se avete bisogno di più grande valore della AGE ... utilizzo @ Età max – waheeda

+1

L'uomo, a volte mi sarebbe piaciuto avere qualcosa di simile [LINQ] (http://en.wikipedia.org/wiki/Language_Integrated_Query) in Cocoa .... – Jay

risposta

14

A meno che "intValue" sia una chiave nel tuo dizionario, il percorso chiave non andrà molto bene.

Se è l'età massima che si è dopo è necessario utilizzare @"@max.age" (sul dizionario) per ottenerlo. Lo stesso vale per qualsiasi altra chiave nel tuo dizionario.

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

Se numbers è una matrice di valori è possibile utilizzare @"@max.self" come il percorso della chiave per ottenere il valore più grande.

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

Sto usando la seconda linea per ottenere l'elemento max dal mio NSMutableArray (che contiene tutti gli oggetti NSNumber all'interno) e Viene visualizzato questo errore: *** Termina l'applicazione a causa dell'eccezione non rilevata 'NSUnknownKeyException', motivo: '[<__ NSCFNumber 0x1dd44bc0> valueForUndefinedKey:]: questa classe non è un valore chiave conforme alla codifica per la chiave massima.' Qualche idea di cosa c'è che non va? – uerceg

+0

Mi dispiace. Supponevo che si sarebbe comportato come NSPredicate e usare 'self' quando non è stato specificato nient'altro. Il secondo esempio corretto sarebbe '[myArrayOfNumbers valueForKeyPath: @" @ max.self "];' (risposta aggiornata) –

+0

Ho pensato che proponessi questa soluzione, ma la cosa veramente strana è che questa soluzione aggiornata NON FUNZIONA per me . Ottengo lo stesso messaggio di errore come prima. – uerceg

1

Sei quasi lì, è sufficiente specificare il campo esatto che si desidera da cui si desidera che il valore massimo:

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

mi sono permesso di modificare i vostri int s per NSInteger s, nel caso in cui qualcuno vuole utilizzare questo codice su entrambi iOS e OS X.

+1

Questa è davvero una buona risposta :) ed è abbastanza diversa dalla risposta accettata per garantire un voto in su – Rambatino