2012-06-24 11 views
8

Dies treibt mich die Wand hoch und ich kann nicht zusammen, wie das geht.Sortieren von Zahlen in NSArray?

Ich hole mein Array von einem Plist, dieses Array ist voller Zahlen (wie in der Plist festgelegt). Jetzt muss ich sie nur sortieren, damit sie absteigen, aber ich kann es nicht verarbeiten.

Hoffe jemand kann helfen, danke.

Antwort

34

Versuchen Sie diesen Code?

NSArray *array = /* loaded from file */; 
array = [array sortedArrayUsingSelector: @selector(compare:)]; 
+0

Aber was der Inhalt des Auswahlverfahrens sein würde? Das bringt mich. –

+0

Welche Selektormethode? –

+0

Die 'compare:' Methode ist für 'NSNumber' Instanzen definiert: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html#// apple_ref/occ/instm/NSNumber/vergleichen: –

11

Im Folgenden werden die Zahlen in aufsteigender Reihenfolge und dann umgekehrt das Ergebnis sortieren Sie die Zahlen in absteigender Reihenfolge zu geben:

NSArray *sorted = [[[array sortedArrayUsingSelector:@selector(compare:)] reverseObjectEnumerator] allObjects]; 

Diese vorherige Frage hat einige andere Alternativen: Sort an NSArray in Descending Order

+0

Ich bekomme einen Absturz mit '- [__ NSCFString sortedArrayUsingSelector:]: unerkannter Selektor an Instanz gesendet. –

+0

Sind Sie sicher, dass Sie 'sortedArrayUsingSelector:' auf einem 'NSArray' aufrufen? Sie scheinen 'sortedArrayUsingSelector:' auf einem 'NSString' zu nennen. Sie sollten wahrscheinlich die Datenstruktur überprüfen, die aus dem Plist geladen wird. – mttrb

+0

@ Josh Kahane, wenn ja, sind Sie wahrscheinlich Probleme mit der Speicherverwaltung mit, denn Ihre 'array' Zeiger auf' NSString' Objekt. Vergessen zu behalten/zu viel [auto] releases? – ivanzoid

4

Es funktioniert für mich:

NSSortDescriptor *sortIdClient = 
[NSSortDescriptor sortDescriptorWithKey:@"campaignValue" 
           ascending:NO 
          comparator: ^(id obj1, id obj2){ 

    return [obj1 compare:obj2 options:NSNumericSearch]; 

}]; 

NSArray *sortDescriptors = @[sortIdClient]; 

NSArray *arrTemp = [self.allCampaignsList sortedArrayUsingDescriptors:sortDescriptors]; 
10

Hier ist eine von vielen Methoden, die Vergleichsblöcke verwenden. Dieses Code-Snippet ist praktisch für jedes Array mit Zahlen, die Sie sortieren möchten. Für aufsteigende Sortierung:

AscendingArray = [UnsortArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    if ([obj1 integerValue] > [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 

    if ([obj1 integerValue] < [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 
    return (NSComparisonResult)NSOrderedSame; 
    }]; 

Für absteigende Sortierung:

DescendingArray = [UnsortArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    if ([obj1 integerValue] > [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 

    if ([obj1 integerValue] < [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 
    return (NSComparisonResult)NSOrderedSame; 
    }]; 
+0

Warum nicht einfach NSNumber 'compare:'? – vikingosegundo

0

Das wird das Problem lösen:

NSArray *array = /* loaded from file */; 
array = [array sortedArrayUsingSelector: @selector(compare:)]; 
+0

bitte entfernen Sie zusätzliche Einrückung, die Text als Code angezeigt werden – YakovL