2012-07-19 3 views
10

OK, damit ich weiß, dass Wörterbücher nicht sortiert werden können. Aber, sagen wir, ich habe NSMutableArray *keys = [someDictionary allKeys]; Nun möchte ich diese Schlüssel, basierend auf den entsprechenden Werten im Wörterbuch (alphabetisch) sortieren. Also, wenn das Wörterbuch key=someString enthält, dann möchte ich keys basierend auf den Zeichenfolgen sortieren, denen sie entsprechen. Ich denke, es ist eine Anwendung von sortUsingComparator, aber es ist ein wenig außerhalb meiner Reichweite zu diesem Zeitpunkt.Objective-C: Sortierschlüssel von NSDictionary basierend auf Wörterbucheinträgen

Antwort

18
NSArray *keys = [someDictionary allKeys]; 
NSArray *sortedKeys = [keys sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
    NSString *first = [someDictionary objectForKey:a]; 
    NSString *second = [someDictionary objectForKey:b]; 
    return [first compare:second]; 
}]; 
+0

Weder 'keys' noch' sortedKeys' sind hier ein veränderbares Wörterbuch, sie sind unveränderlich. –

+0

ops du meinst ein veränderbares Array? Ich habe nur kopieren und einfügen von der Frage ha – mask8

+0

ja, ich meinte veränderbare Array. –

3
NSDictionary *dict = // however you obtain the dictionary 
NSMutableArray *sortedKeys = [NSMutableArray array]; 

NSArray *objs = [dict allValues]; 
NSArray *sortedObjs = [objs sortedArrayUsingSelector:@selector(compare:)]; 
for (NSString *s in sortedObjs) 
    [sortedKeys addObjectsFromArray:[dict allKeysForObject:s]]; 

Jetzt sortedKey enthält die Schlüssel nach ihren entsprechenden Objekten sortiert.

+0

Was ist, wenn es nicht nur Schlüsselwert ist. Was ist, wenn jeder Schlüssel einem Wörterbuch entspricht und ich nach dem Schlüssel "name" in diesem Wörterbuch sortieren möchte? Tut mir leid, ich hätte das im OP erwähnen sollen. Danke für die Hilfe! – JoshDG

+0

Es ist immer * nur "Schlüsselwert", denn dafür ist NSDictionary gedacht. Was Sie meinen, sind nicht-skalare Werte - in diesem Fall müssen Sie dies zu einer Funktion machen und Rekursion anwenden. –

+0

Dies ist vom Standpunkt der Leistung nicht sehr clever und wird in einigen Fällen nicht das richtige Ergebnis liefern. – Sven

1

Schreiben Sie einfach hier, weil ich es nicht überall finden: Um eine alphanumerische zu erhalten sortiert NSDictionary zurück von einem NSDictionary basierend auf dem Wert - was in meinem Fall notwendig war - man kann folgendes tun:

//sort typeDict alphanumeric to show it in order of values 
    NSArray *keys = [typeDict allKeys]; 

    NSArray *sortedKeys = [keys sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
     NSString *first = [typeDict objectForKey:a]; 
     NSString *second = [typeDict objectForKey:b]; 
     return [first compare:second]; 
    }]; 
    NSLog(@"sorted Array: %@", sortedKeys); 

    NSMutableDictionary *sortedTypeDict = [NSMutableDictionary dictionary]; 
    int counter = 0; 
    for(int i=0; i < [typeDict count]; i++){ 
     NSString *val = [typeDict objectForKey:[sortedKeys objectAtIndex:counter]]; 
     NSString *thekey = [sortedKeys objectAtIndex:counter]; 
     [sortedTypeDict setObject:val forKey:thekey]; 
     counter++; 
    } 
    NSLog(@"\n\nsorted dict: %@", sortedTypeDict); 

Keine große Sache!

+0

war auf der Suche nach diesem, danke! –

2

Sortierschlüssel von NSDictionary basierend auf Wörterbuch Schlüssel

Abobe für mit basierend auf Wörterbuchinhhalt ein sortiertes Array zurückkehrt, ist dies für die Rückführung ein Array von Wörterbuchschlüssel sortiert:

NSArray *keys = [theDictionary allKeys]; 
NSArray *sortedKeys = [keys sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
    return [a compare:b]; 
}]; 
NSMutableArray *sortedValues = [NSMutableArray new]; 
for(NSString *key in sortedKeys) 
    [sortedValues addObject:[dictFilterValues objectForKey:key]]; 
Verwandte Themen