2014-06-20 11 views
5

Consente supponiamo di avere un allineamento come questoObjective-C, ordinare un array di stringhe contenente i numeri

NSArray* arr = @[@"1",@"4",@"2",@"8",@"11",@"10",@"14",@"9"]; //note: strings containing numbers 

e voglio ordinarli in questo modo: [1,2,4,8,9,10 , 11,14]

ma se uso

[arr sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 

ottengo [1,10,11,14,2,4,8,9] ... e se uso:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"length" ascending:YES]; 
    NSArray *sortDescriptors = @[sortDescriptor]; 
    [arr sortedArrayUsingDescriptors:sortDescriptors]; 

Ottengo qualcosa del genere: [1,4,2,8,9,11,10,14]

Come posso combinare entrambi i predicati? o è un altro modo più semplice per risolvere questo? NOTA: l'uscita di questo array è solo a scopo di debug, Non mi preoccupo se il risultato si trasforma l'array in interi finché posso stampare in console con NSLog grazie

+0

In realtà sarebbe meglio una funzione che restituisce i numeri mancanti tra il minimo ed il valore massimo ... esempio di input: [1,5,4] ... uscita : [2,3] – user2387149

risposta

8

provare a utilizzare blocchi

[arr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 

    if ([obj1 intValue] == [obj2 intValue]) 
     return NSOrderedSame; 

    else if ([obj1 intValue] < [obj2 intValue]) 
     return NSOrderedAscending; 

    else 
     return NSOrderedDescending; 

}]; 
+0

grazie amico, ho appena dovuto cambiare il ">" per "<" – user2387149

+0

oh scusate il mio male. Ho aggiornato la risposta. – cekisakurek

+5

La parte importante di questa risposta è persa nella spiegazione minima. Puoi ordinare i blocchi o ordinare i descrittori - non sono * i blocchi * che fanno la differenza qui. L'importante è usare '-intValue' piuttosto che cercare di combinare' -length' e '-localizedCaseInsensitiveCompare:'. – Caleb

8

Il il problema è che stai provando ad usare sia il confronto delle stringhe che lo -length per mettere insieme ciò che vuoi veramente, che è il confronto numerico. Ma i descrittori di ordinamento vengono applicati uno alla volta e un secondo descrittore viene utilizzato solo se il primo ordina due elementi come lo stesso. L'utilizzo di -intValue per ordinare gli elementi consente di utilizzare un singolo descrittore di ordinamento che ordinerà gli articoli nel modo desiderato.

fare questo, invece:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"intValue" ascending:YES]; 
[arr sortedArrayUsingDescriptors:@[sortDescriptor]];