2009-12-21 25 views
20

Ich habe ein Array von NSString-Objekten, die ich absteigend sortieren muss.Array (NSArray) in absteigender Reihenfolge sortieren

Da ich keine API gefunden habe, um das Array in absteigender Reihenfolge zu sortieren, ging ich auf folgende Weise.

Ich schrieb eine Kategorie für NSString wie unten aufgeführt.

- (NSComparisonResult)CompareDescending:(NSString *)aString 
{ 

    NSComparisonResult returnResult = NSOrderedSame; 

    returnResult = [self compare:aString]; 

    if(NSOrderedAscending == returnResult) 
     returnResult = NSOrderedDescending; 
    else if(NSOrderedDescending == returnResult) 
     returnResult = NSOrderedAscending; 

    return returnResult; 
} 

Dann sortierte ich das Array die Anweisung mit

NSArray *sortedArray = [inFileTypes sortedArrayUsingSelector:@selector(CompareDescending:)]; 

Ist dies der richtige Lösung? Gibt es eine bessere Lösung?

Antwort

54

können Sie NSSortDescriptor verwenden:

NSSortDescriptor* sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:nil ascending:NO selector:@selector(localizedCompare:)]; 
NSArray* sortedArray = [inFileTypes sortedArrayUsingDescriptors:@[sortDescriptor]]; 

wir localizedCompare: Hier verwenden die Saiten zu vergleichen, und übergeben NO an die aufsteigende: Option in absteigender Reihenfolge zu sortieren.

+0

seit 'sortDescriptorWithKey' 10,6 aboveI folgende Anweisung verwendet haben. [[NSSortDescriptor alloc] initWithKey: nicht aufsteigend: NO]; danke ... –

+0

In der Tat hätte ich das erwähnt - vergessen Sie nicht die -autorelease obwohl :) –

+0

Funktioniert super! Danke! –

4

Mit diesem Code können wir das Array in absteigender Reihenfolge auf der Grundlage der Länge sortieren.

2

oder vereinfachen Sie Ihre Lösung:

NSArray *temp = [[NSArray alloc] initWithObjects:@"b", @"c", @"5", @"d", @"85", nil]; 
NSArray *sortedArray = [temp sortedArrayUsingComparator: 
         ^NSComparisonResult(id obj1, id obj2){ 
          //descending order 
          return [obj2 compare:obj1]; 
          //ascending order 
          return [obj1 compare:obj2]; 
         }]; 
NSLog(@"%@", sortedArray); 
Verwandte Themen