Я могу получить массив ключей словаря, отсортированных по значениям, но как мне получить массив значений, отсортированных по ключам словаря? Я искал везде, не повезло. Любая помощь была оценена.
Сортировать значения NSDictionary по ключевому алфавитному порядку
Ответ 1
Это может сработать:
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
Один из способов - создать массив отсортированных ключей словаря, а затем создать другой массив значений на основе массива ключей:
//Construct array of sorted keys
NSArray keyarray = ... //etc
NSMutableArray valuearray = [[NSMutableArray alloc] init];
for (id key in keyarray) {
[valuearray addObject:[dict objectForKey:key]];
}
Ответ 3
Мой опыт показывает, что сортировка NSDictionary
по ключам не очень полезна. Хотя после logging
NSDictionary
они, похоже, сортируются, когда необходимо помещать их в табличное представление, они больше не в порядке.
Я предлагаю хранить ключи в свойстве NSArray
и затем запрашивать объекты NSDictionary
в соответствии с порядком ключей в NSArray
.
Ответ 4
Я создал категорию в 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