Сортировка NSDictionary по количеству дочерних элементов на ключ

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

Я хотел бы отсортировать NSDictionary по количеству значений (т.е. по количеству) для каждого ключа. Нужно ли мне использовать пользовательский NSSortDescriptor, и если да, я был бы очень признателен за помощь с кодом. Ниже приведен пример NSDictionary, который я хотел бы отсортировать.

2 способа, которыми я хотел бы иметь возможность сортировать словарь:

1) Отсортировать так, чтобы ключ «Австралия» стоял первым, потому что там 3 города, затем США с 2 городами и, наконец, Великобритания с 1 городом?

2) В качестве бонуса я также хотел бы иметь возможность сортировать по количеству объектов, т. Е. Сначала Австралия с 6 объектами, затем Великобритания с 4 объектами (хотя только 1 город), затем США с 2 объектами.

"United Kingdom" = {
    "City 1" = {
        1 = "Object A";
        2 = "Object B";
        3 = "Object C";
        4 = "Object D";
    };
};
"Australia" = {
    "City 1" = {
        5 = "Object E";
        6 = "Object F";
        7 = "Object G";
    };
    "City 2" = {
        8 = "Object H";
        9 = "Object I";
    };
    "City 3" = {
        10 = "Object J";
    };
};
"United States of America" = {
    "City 1" = {
        11 = "Object K";
    };
    "City 2" = {
        12 = "Object L";
    };
};

person Andy    schedule 14.09.2011    source источник
comment
NSDictionary имеет только одно значение для каждого ключа. Вы имеете в виду, что храните NSArray в NSDictionary и хотите отсортировать его по количеству элементов в каждом NSArray?   -  person SVD    schedule 15.09.2011


Ответы (2)


Предполагая, что вы храните массивы в словаре, вы можете сделать что-то вроде этого:

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 SVD    schedule 14.09.2011
comment
СВД, Большое спасибо! Я знал, что в какой-то момент мне нужно будет преобразовать словарь в массивы, чтобы выполнить сортировку, но подумал, что просто включу проблему и необработанный набор данных, который у меня был. Это именно то, что я ищу, чтобы выполнить первую часть вопроса. Еще раз спасибо. - person Andy; 15.09.2011

NSDictionary — это коллекция ключей и значений. Это не сортируется. Вместо этого вам придется преобразовать его в NSArray (из NSArray).

Для NSArray вы найдете несколько способов сортировки:

person vikingosegundo    schedule 14.09.2011