Сортировка NSDictionary по количеству значений в ключе

У меня есть NSDictionary с ключом, представляющим собой страну и объект, представляющий собой массив городов:

United States
    New York
    Portland
    Austin
    San Francisco

India
    New Delhi

Belgium
    Antwerp
    Brussels

Я хотел бы создать словарь из этого словаря, который выглядит так:

United States
    4

Belgium 
    2

India 
    1

Таким образом, сортируется от наибольшего количества ключей к наименьшему количеству ключей, а новый ключ - это количество ключей в исходном словаре. Это возможно? Какой способ будет наиболее эффективным?

Самое дальнее, что я получил, - это использовать

NSComparator sorter = ^NSComparisonResult(id a, id b)
{
    NSArray* a1 = a;
    NSArray* a2 = b;
    if([a1 count] > [a2 count]) return NSOrderedAscending; 
    if([a1 count] < [a2 count]) return NSOrderedDescending; 
    return NSOrderedSame;
}

NSArray* ordered = [dictionary keysSortedByValueUsingComparator:sorter];

Но тогда у меня есть только упорядоченный массив, а не значения, прикрепленные к этому массиву.

Заранее спасибо!


person sixstatesaway    schedule 16.07.2013    source источник
comment
Может быть, это может помочь stackoverflow.com/questions/9708742/   -  person    schedule 16.07.2013
comment
Обратите внимание, что словарь представляет собой набор неупорядоченных пар ключ/значение. Вы не можете прописать порядок ключей в словаре.   -  person Martin R    schedule 16.07.2013


Ответы (3)


Вам нужно создать новый класс, состоящий из countryName и numberOfCities членов. Сделав это, вы можете создать массив этих объектов и отсортировать их.

Например, пользовательский объект может иметь файл заголовка, подобный этому:

@interface Country : NSObject

@property (nonatomic, strong) NSString *countryName;
@property (nonatomic) NSUInteger numberOfCities;

@end
person Ander    schedule 16.07.2013

Вы можете сделать это так для ключа:

NSArray *sortKeys = [[dictionary allKeys] sortedArrayUsingSelector: @selector(compare:)];
NSMutableArray *sortedValues = [NSMutableArray array];
for (NSString *key in sortKeys) {
    [sortedValues addObject: [dictionary objectForKey: key]];
}

И по стоимости:

 NSArray *sortedKeys = [dictionary keysSortedByValueUsingSelector: @selector(compare:)];
person soryngod    schedule 16.07.2013

Вы не можете сортировать NSDictionary, это неупорядоченная коллекция. Вы можете построить представление. Вы уже сделали работу. Вам просто нужен массив для его представления. Отсортированный массив может содержать ваши ключевые пути к каждому ключу в словаре.

person uchuugaka    schedule 16.07.2013