сортировать значения NSDictionary по ключевому алфавитному порядку - PullRequest
24 голосов
/ 30 сентября 2011

Я могу получить массив ключей словаря, отсортированных по значениям, но как мне получить массив значений, отсортированных по ключам словаря?Я искал везде без удачи.Любая помощь приветствуется.

Ответы [ 4 ]

44 голосов
/ 30 сентября 2011

Это может работать:

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

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

или в Swift

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

или

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

… и этоВот почему вы должны начать разработку в Swift ?

2 голосов
/ 28 июля 2012

Мой опыт показывает, что сортировка NSDictionary по ключам не очень полезна.Хотя после logging NSDictionary они кажутся отсортированными, при необходимости поместить их в представление таблицы они уже не в порядке.

Я предлагаю сохранить ключи в свойстве NSArray, а затемзапросить объекты NSDictionary в соответствии с порядком клавиш в NSArray.

2 голосов
/ 30 сентября 2011

Один из способов - создать массив отсортированных словарных ключей, а затем создать другой массив значений на основе массива ключей:

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

NSMutableArray valuearray = [[NSMutableArray alloc] init];
for (id key in keyarray) {
    [valuearray addObject:[dict objectForKey:key]];
}
0 голосов
/ 23 апреля 2014

Я создал категорию на NSDictionary, чтобы добиться этого:

@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
...