web-dev-qa-db-fra.com

trier les valeurs NSDictionnaire par ordre alphabétique des clés

Je peux obtenir un tableau de clés de dictionnaire trié par valeurs, mais comment obtenir un tableau de valeurs trié par clés de dictionnaire? J'ai cherché partout sans succès. Toute aide appréciée.

23
johnbakers

Cela pourrait fonctionner:

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

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

ou à Swift

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

ou 

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

… Et c'est pourquoi vous devriez commencer à vous développer à Swift ????

44
Ashley Mills

Mon expérience montre que le tri de NSDictionary par clés n’est pas très utile. Bien que, après logging, les NSDictionary semblent être triés, ils ne sont plus en état de les mettre dans une table.

Je suggère de stocker les clés dans une propriété NSArray, puis d'interroger les objets NSDictionary selon l'ordre des clés dans NSArray.

2
NRR

Une solution consiste à construire le tableau de clés de dictionnaire triées, puis à créer un autre tableau de valeurs basé sur le tableau de clés:

//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

J'ai créé une catégorie sur NSDictionary pour obtenir ce résultat:

@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