2012-11-12 13 views
6

Eventuali duplicati:
Sorting NSString values as if NSInteger using NSSortDescriptorOrdinamento di un array con le stringhe che contiene i numeri

Ho un array che riempio con il mio NSMutableDictionary .. e io uso questo:

myArray =[[myDict allKeys]sortedArrayUsingSelector:@selector(IDONTKNOW:)]; 

AllKeys of myDicts sono NSStrings ... come 123.423 o 423.343 ... Ho bisogno di ordinare il nuovo myArray di in numeri crementali .. 12.234 45.3343 522.533 5432.66 ecc. ecc.

Cosa deve essere inserito in @selector per farlo correttamente? Grazie

+0

uno sguardo alla risposta qui http://stackoverflow.com/a/38347576/5165668 – OlDor

risposta

19

È possibile utilizzare una NSSortDescriptor e passare doubleValue come chiave.

//sfloats would be your [myDict allKeys] 
NSArray *sfloats = @[ @"192.5235", @"235.4362", @"3.235", @"500.235", @"219.72" ]; 
NSArray *myArray = [sfloats sortedArrayUsingDescriptors: 
        @[[NSSortDescriptor sortDescriptorWithKey:@"doubleValue" 
                ascending:YES]]]; 

NSLog(@"Sorted: %@", myArray); 
5

Non è possibile utilizzare direttamente sortedArrayUsingSelector:. Utilizzare sortedArrayUsingComparator: e implementare un blocco di confronto da soli.

Un po 'come questo q/a:

Changing the sort order of -[NSArray sortedArrayUsingComparator:]

(In realtà, che il codice di domanda può probabilmente copia/incollato nel codice e sarà "solo lavoro" una volta si cambia da integerValue per doubleValue per i quattro chiamate convert-string-to-numero):

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) { 
    double n1 = [obj1 doubleValue]; 
    double n2 = [obj2 doubleValue]; 
    if (n1 > n2) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 

    if (n1 < n2) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 

    return (NSComparisonResult)NSOrderedSame; 
}]; 
+0

Grande risposta! Salva la mia giornata – DzungPV

0

Considerare sortedArrayUsingFunction:. Ciò consente di definire una funzione di confronto personalizzata da utilizzare quando si confrontano gli elementi.

myArray =[[myDict allKeys]sortedArrayUsingFunction:SortAsNumbers context:self]; 

NSInteger SortAsNumbers(id id1, id id2, void *context) 
{ 
    float v1 = [id1 floatValue]; 
    float v2 = [id2 floatValue]; 
    if (v1 < v2) { 
     return NSOrderedAscending; 
    } else if (v1 > v2) { 
     return NSOrderedDescending; 
    } 
    return NSOrderedSame; 
} 

Maggiori informazioni disponibili su: Sort NSArray using sortedArrayUsingFunction

Problemi correlati