2010-07-21 27 views
5

Sto cercando di ordinare un array che sarebbe simile a questa: (si prega di ignorare il fatto che queste persone sono ben oltre qualsiasi età vivente I grandi numeri solo bisogno!)Ordinamento di un NSArray da un valore NSDictionary

NSDictionary *person1 = [NSDictionary dictionaryWithObjectsAndKeys:@"sam",@"name",@"28.00",@"age",nil]; 
NSDictionary *person2 = [NSDictionary dictionaryWithObjectsAndKeys:@"cody",@"name",@"100.00",@"age",nil]; 
NSDictionary *person3 = [NSDictionary dictionaryWithObjectsAndKeys:@"marvin",@"name",@"299.00",@"age",nil]; 
NSDictionary *person4 = [NSDictionary dictionaryWithObjectsAndKeys:@"billy",@"name",@"0.0",@"age",nil]; 
NSDictionary *person5 = [NSDictionary dictionaryWithObjectsAndKeys:@"tammy",@"name",@"54.00",@"age",nil]; 

NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:person1,person2,person3,person4,person5,nil]; 

// before sort 
NSLog(@"%@",arr); 

NSSortDescriptor *ageSorter = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES]; 
[arr sortUsingDescriptors:[NSArray arrayWithObject:ageSorter]]; 

// after sort 
NSLog(@"%@",arr); 

Ora, prima di ordinare l'output potrebbe essere:

2010-07-21 10:46:31.898 Sorting[70673:207] (
    { 
    age = "28.00"; 
    name = sam; 
}, 
    { 
    age = "100.00"; 
    name = cody; 
}, 
    { 
    age = "299.00"; 
    name = marvin; 
}, 
    { 
    age = "0.0"; 
    name = billy; 
}, 
    { 
    age = "54.00"; 
    name = tammy; 
} 

)

e dopo l'ordinamento:

2010-07-21 10:46:31.900 Sorting[70673:207] (
    { 
    age = "0.0"; 
    name = billy; 
}, 
    { 
    age = "100.00"; 
    name = cody; 
}, 
    { 
    age = "28.00"; 
    name = sam; 
}, 
    { 
    age = "299.00"; 
    name = marvin; 
}, 
    { 
    age = "54.00"; 
    name = tammy; 
} 

)

Come si può vedere lo fa specie, ma dalla mia comprensione è l'ordinamento per stringa. Ho provato, ma dopo alcuni giorni di fallimento nel tentativo di scrivere un metodo che avrebbe risolto questo problema per me, sono ancora in perdita. Quale sarebbe l'approccio migliore e la realizzazione di questo in modo da ordinare un valore numerico?

+0

Perché non Hai archiviato l'età come numero? [NSNumber numberWithFloat: 28.0f]; – Gobra

+0

Poiché il vero script con cui sto lavorando viene tirato usando JSON, così come un oggetto stringa altrimenti lo farei :) – cdnicoll

risposta

10

Anche se io metto in discussione l'uso di corde qui, il modo più semplice per lavorare con i dati con BE:

[array sortedArrayUsingComparator:^(NSDictionary *item1, NSDictionary *item2) { 
    NSString *age1 = [item1 objectForKey:@"age"]; 
    NSString *age2 = [item2 objectForKey:@"age"]; 
    return [age1 compare:age2 options:NSNumericSearch]; 
}]; 

Oppure, usando più recenti funzionalità di indicizzazione di Objective-C:

[array sortedArrayUsingComparator:^(NSDictionary *item1, NSDictionary *item2) { 
    return [item1[@"age"] compare:item2[@"age"] options:NSNumericSearch]; 
}]; 
+0

Ho dovuto modificare questo tocco ma ha funzionato, grazie! – cdnicoll

0

Il più semplice sarebbe memorizzare l'età come un numero anziché una stringa.

+0

Vedere il mio commento sopra. Arriva come un oggetto JSON quindi non riesco a renderlo esattamente un valore int. – cdnicoll

Problemi correlati