webentwicklung-frage-antwort-db.com.de

nSDictionary-Werte nach alphabetischer Reihenfolge sortieren

Ich kann ein Array von Wörterbuchschlüsseln nach Werten sortieren, aber wie bekomme ich ein Array von Werten, die nach Wörterbuchschlüsseln sortiert sind? Ich habe überall ohne Glück gesucht. Jede Hilfe geschätzt.

23
johnbakers

Das könnte funktionieren:

NSArray * sortedKeys = [[dict allKeys] sortedArrayUsingSelector: @selector(caseInsensitiveCompare:)];

NSArray * objects = [dict objectsForKeys: sortedKeys notFoundMarker: [NSNull null]];

oder in Swift

let objects = dict.keys.sorted().flatMap{ dict[$0] }

oder 

let objects = dict.sorted{ $0.0 < $1.0 }.map{ $1 }

… Und deshalb sollten Sie mit der Entwicklung in Swift beginnen ????

44
Ashley Mills

Meine Erfahrung zeigt, dass das Sortieren von NSDictionary nach Schlüsseln nicht sehr nützlich ist. Obwohl nach logging die NSDictionary scheinbar sortiert sind, sind sie nicht mehr in der richtigen Reihenfolge, wenn sie in eine Tabellenansicht eingefügt werden sollen.

Ich schlage vor, die Schlüssel in einer NSArray-Eigenschaft zu speichern, und frage dann die NSDictionary-Objekte entsprechend der Reihenfolge der Schlüssel in der NSArray ab.

2
NRR

Eine Möglichkeit besteht darin, ein Array von sortierten Wörterbuchschlüsseln zu erstellen und dann ein anderes Array der Werte basierend auf dem Array von Schlüsseln zu erstellen:

//Construct array of sorted keys
NSArray keyarray = ... //etc

NSMutableArray valuearray = [[NSMutableArray alloc] init];
for (id key in keyarray) {
    [valuearray addObject:[dict objectForKey:key]];
}
2
Sean

Ich habe eine Kategorie in NSDictionary erstellt, um dies zu erreichen:

@implementation NSDictionary (Extra)

-(NSArray *) sortedKeys {
    return [[self allKeys] sortedArrayUsingSelector:@selector(compare:)];
}

-(NSArray *) allValuesSortedByKey {
    return [self objectsForKeys:self.sortedKeys notFoundMarker:[NSNull null]];
}

-(id) firstKey {
    return [self.sortedKeys firstObject];
}

-(id) firstValue {
    return [self valueForKey: [self firstKey]];
}

@end
0
Bjinse