2016-11-02 3 views
1

Ich habe ein Array von Zahlen und Strings. wieSortiere ein Array von Zahlen und Strings

NSArray* list = @[@"9", @"21", @"A 2-5", @"19-1", @"10", @"D 7-10", @"13-2"]; 

Ich möchte dieses Array sortiert als

@[@"9", @"10", @"21", @"13-2", @"19-1", @"A 2-5", @"D 7-10"]; 

Aber wenn ich

[list sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) { 
    return [obj1 compare:obj2]; 
}]; 

verwende ich bekommen

@[@"10", @"13-2", @"19-1", @"21", @"9", @"A 2-5", @"D 7-10"]; 

auch ich ähnliches Ergebnis, wenn ich

verwenden
[list sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 

Wie kann ich das Ergebnis wie erwartet erreichen?

+2

Verwenden Sie 'return [obj1 vergleichen: obj2 Optionen: NSNumericSearch];'. – rmaddy

+0

noch besser (y). – x4h1d

Antwort

1

Sie waren auf dem richtigen Weg mit sortedArrayUsingComparator. Hier ist, wie Sie es umsetzen können:

NSArray* list = @[@"9", @"21", @"A 2-5", @"19-1", @"10", @"D 7-10", @"13-2"]; 
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; 
NSArray *sortedList = [list sortedArrayUsingComparator:^NSComparisonResult(NSString *string1, NSString *string2) { 
     NSNumber *number1 = [numberFormatter numberFromString:string1]; 
     NSNumber *number2 = [numberFormatter numberFromString:string2]; 

     if (number1 && number2) 
      return [number1 compare:number2]; 
     else if (number1) 
      return NSOrderedAscending; 
     else if (number2) 
      return NSOrderedDescending; 
     else return [string1 compare:string2]; 
}]; 
NSLog(@"sortedList: %@", sortedList); 

Ausgang:

( 9, 10, 21, "13-2", "19-1", „A 2-5" , "D 7-10")

der Grund, warum Sie nicht integerValue stattverwenden können 0 ist das zum Beispiel, es wird 13-2 als 13 parsen und es wird vor 21 gehen, was nicht das ist, was Sie erwarten. NSNumberFormatter ist etwas flexibler und gibt nil zurück, wenn eine Zeichenfolge nicht genau eine Zahl ist.

+0

Ich habe versucht, mit der Konvertierung in ganzzahligen Wert, wie Sie erwähnt haben. Vielen Dank. – x4h1d

+0

Dies ist der schwierigste Weg, um die Sortierung durchzuführen. – rmaddy

+0

@rmaddy Du machst mich unwissend :) – alexburtnik

0

Das Problem, mit dem Sie konfrontiert sind, ist, dass Sie nicht haben "ein Array von Zahlen und Strings", haben Sie ein Array von Strings. Sie werden anhand der Zeichenfolge verglichen: Vergleichen Sie das erste Zeichen, wenn das erste Zeichen das gleiche ist, vergleichen Sie das zweite Zeichen usw. Dies ergibt die Reihenfolge, die Sie erhalten.

Wenn Sie die von Ihnen angegebene Reihenfolge wünschen, müssen Sie eine benutzerdefinierte Vergleichs-/Sortiermethode implementieren (this answer zeigt die Möglichkeiten schön).

Verwandte Themen