Подтвердить что ты не робот

Сортировать значения NSDictionary по ключевому алфавитному порядку

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

4b9b3361

Ответ 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