2010-12-29 13 views
19

Ich habe eine NSMutableDictionary, die NSString zu NSString abbildet (obwohl die Werte NSStrings sind, sind sie wirklich nur ganze Zahlen).Sortiere ein NSMutableDictionary

Zum Beispiel sollten Sie die folgenden Abbildungen,

"dog" --> "4" 
"cat" --> "3" 
"turtle" --> "6" 

Ich mag würde mit den 10 Einträgen im Wörterbuch nach absteigender Reihenfolge des Wertes sortiert enden. Kann mir jemand Code dafür zeigen? Vielleicht gibt es eine Reihe von Schlüsseln und ein anderes Wertefeld. Wie auch immer, es macht mir nichts aus. Ich versuche nur, es effizient zu machen.

Vielen Dank!

Antwort

46

Holen Sie sich das Array der Werte, sortieren Sie das Array und erhalten Sie den Schlüssel, der dem Wert entspricht.

Sie können mit den Werten erhalten:

NSArray* values = [myDict allValues]; 
NSArray* sortedValues = [values sortedArrayUsingSelector:@selector(comparator)]; 

Wenn aber die Sammlung ist, wie Sie in Ihrem Beispiel zeigen, (ich meine, können Sie den Wert aus dem Schlüssel entnehmen), können Sie immer die sortieren Tasten statt mit den Werten herumspielen.

Verwendung:

NSArray* sortedKeys = [myDict keysSortedByValueUsingSelector:@selector(comparator)]; 

Der Komparator ist eine Nachricht, Selektor, der auf das Objekt gesendet wird, die Sie bestellen möchten.

Wenn Sie Strings bestellen möchten, sollten Sie einen NSString-Vergleicher verwenden. Die NSString-Komparatoren sind: caseInsensitiveCompare oder localizedCaseInsensitiveCompare :.

Wenn keine dieser gültig für Sie ist, können Sie Ihre eigene Komparatorfunktion

[values sortedArrayUsingFunction:comparatorFunction context:nil] 

Being comparatorFunction (von AppleDocumentation) nennen

NSInteger intSort(id num1, id num2, void *context) 
{ 
    int v1 = [num1 intValue]; 
    int v2 = [num2 intValue]; 
    if (v1 < v2) 
     return NSOrderedAscending; 
    else if (v1 > v2) 
     return NSOrderedDescending; 
    else 
     return NSOrderedSame; 
} 
+0

Okay, also lassen Sie uns sagen, dass ich Ihre zweite Methode verwenden möchten. Was genau ist "Komparator". Es tut mir leid, dass ich diese Methode noch nie zuvor benutzt habe. Bedeutet das, dass ich meine eigene Funktion schreiben muss? Wie würde es aussehen? Vielen Dank!! – CodeGuy

+0

Ich habe die Antwort bearbeitet, hoffe, es ist jetzt klar genug – HyLian

+2

@HyLian Was ist, wenn NSDictionary doppelte Werte für verschiedene Schlüssel enthält. Wie werden Sie verfolgen, welcher Schlüssel abgeholt werden soll? –

0
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"interest" ascending:YES]; 
[unsortedArray sortUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]]; 
recentSortedArray = [stories copy]; 
4

Der einfachste Weg ist:

NSArray *sortedValues = [[yourDictionary allValues] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 
NSMutableDictionary *orderedDictionary=[[NSMutableDictionary alloc]init]; 
for(NSString *valor in sortedValues){ 
    for(NSString *clave in [yourDictionary allKeys]){ 
     if ([valor isEqualToString:[yourDictionary valueForKey:clave]]) { 
      [orderedDictionary setValue:valor forKey:clave]; 
     } 
    } 
} 
+0

Dies ist nicht effizient, die akzeptierte Antwort hat die richtige Lösung. – Cutetare

3

Sortieren der Schlüssel und dass ein Array mit den Werten füllen mit:

NSArray *keys = [dict allKeys]; 
NSArray *sKeys = [keys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 
NSMutableArray *sValues = [[[NSMutableArray alloc] init] autorelease]; 

for(id k in sKeys) { 
    id val = [dict objectForKey:k]; 
    [sValues addObject:val]; 
} 
+0

Ideal für die Übersetzung eines Wörterbuchs in das sortierte Array, sortiert nach Schlüsseln. –

+0

Es wird keine zweistellige Nummer sortiert. – Rajesh

4

Verwenden Sie diese Methode:

- (NSArray *)sortKeysByIntValue:(NSDictionary *)dictionary { 

    NSArray *sortedKeys = [dictionary keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
     int v1 = [obj1 intValue]; 
     int v2 = [obj2 intValue]; 
     if (v1 < v2) 
      return NSOrderedAscending; 
     else if (v1 > v2) 
      return NSOrderedDescending; 
     else 
      return NSOrderedSame; 
    }]; 
    return sortedKeys; 
} 

es aufrufen und dann ein neues Wörterbuch mit Schlüssel nach Wert sortiert erstellen:

NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys: 
          @"4", @"dog", 
          @"3", @"cat", 
          @"6", @"turtle", 
          nil]; 

NSArray *sortedKeys = [self sortKeysByIntValue:dictionary]; 
NSMutableDictionary *sortedDictionary = [[NSMutableDictionary alloc] init]; 

for (NSString *key in sortedKeys){ 
    [sortedDictionary setObject:dictionary[key] forKey:key]; 
} 
0

Wenn Sie Daten in aufsteigender Reihenfolge für Schlüssel 'Name' für solche Art von Beispiel sortieren möchten, dann kann dies Ihnen helfen.

arrayAnimalList = [ { 'name' = Hund, 'animal_id' = 001 }, { 'name' = Ratte, 'animal_id' = 002 }, { ‚name '= Katze, ' Tier-ID '= 003 } ];

Dies ist ein Code, der Ihnen helfen, sortiertes Array zu erhalten

//here you have to pass key for which you want to sort data 

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 

    NSArray *sortDescriptors = [NSArray arrayWithObject:descriptor]; 

    // here you will get sorted array in 'sortedArray' 
    NSMutableArray * sortedArray = [[arrayAnimalList sortedArrayUsingDescriptors:sortDescriptors] mutableCopy]; 
Verwandte Themen