2013-04-05 2 views
7

Ich versuche, ein NSDictionary zu sortieren.Sortieren eines NSDictionary, absteigend. Wie sende ich Optionen mit dem `compare: options:` Selektor?

Vom Apple docs Ich sehe Sie keysSortedByValueUsingSelector verwenden können:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
    [NSNumber numberWithInt:63], @"Mathematics", 
    [NSNumber numberWithInt:72], @"English", 
    [NSNumber numberWithInt:55], @"History", 
    [NSNumber numberWithInt:49], @"Geography", 
    nil]; 

NSArray *sortedKeysArray = [dict keysSortedByValueUsingSelector:@selector(compare:)]; 

die gibt:

// sortedKeysArray contains: Geography, History, Mathematics, English 

aber ich will:

// sortedKeysArray contains: English, Mathematics, History, Geography 

Ich habe gelesen, dass Sie compare:options: verwenden können und eine NSStringCompareOptions, um die comp zu ändern arison in die andere Richtung zu vergleichen.

Allerdings verstehe ich nicht, wie Sie senden compare:options:mit einer Option im Selektor.

Ich möchte so etwas wie dies zu tun:

NSArray *sortedKeysArray = [dict keysSortedByValueUsingSelector:@selector(compare:options:NSOrderDescending)]; 

Wie soll ich den Auftrag des Vergleichs wechseln?

Verwandte: https://discussions.apple.com/thread/3411089?start=0&tstart=0

+0

'NSArray * ascedingArray = [[sortedKeysArray reverseObjectEnumerator] allObjects] Siehe;' –

Antwort

4

Ich benutze:

NSSortDescriptor *sortOrder = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO]; 
    self. sortedKeys = [[self.keyedInventoryItems allKeys] sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortOrder]]; 
+0

Diese Antwort ist falsch. Es sortiert die Schlüssel in absteigender Reihenfolge, ohne Bezug auf die Werte im Wörterbuch. @ Noa's Antwort, um den Komparator zu verwenden, ist richtig. – Jon

13

Option 1: Verwenden Sie einen Komparator -compare: in umgekehrter aufzurufen: (! Dank Dan Shelly)

NSArray *blockSortedKeys = [dict keysSortedByValueUsingComparator: ^(id obj1, id obj2) { 
    // Switching the order of the operands reverses the sort direction 
    return [objc2 compare:obj1]; 
}]; 

Nur Umkehr der absteigenden und aufsteigenden Return-Anweisungen und Sie sollten genau das bekommen, was Sie w Ameise.

Option 2: das Array umkehren Sie haben:

How can I reverse a NSArray in Objective-C?

+0

oder [dict keysSortedByValueUsingComparator:^NSComparisonResult (id obj1, id obj2) { zurück [obj2 vergleichen: obj1]; }]; –

+0

Das würde das Array nicht umkehren, obwohl 'return - [objc2 compare: obj1]' funktionieren würde. – paulmelnikow

+0

Ich habe es an einem einfachen Beispiel ... getestet, um genauer zu sein, in einer Vergleichsbasierten Sortierung, Umkehr der Reihenfolge des Vergleichs wird das resultierende Array umkehren –

Verwandte Themen