Ключово е сортирането на 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