Почему NSDictionary алфавитен в памяти, а не в перечислении? - PullRequest
4 голосов
/ 19 ноября 2010

Я понимаю, что правильный способ сортировки NSDictionary состоит в создании массива из ключей, сортировке массива, а затем перечислении массива и работе с NSDictionary оттуда.Мой вопрос, для NSDictionary * dict, с ключами и значениями строк,

Почему это в алфавитном порядке:

NSLog(@"%@", dict);

Но это не так:

for (NSString *w in dict)
{
    NSLog(@"%@", w);
}

Кажется странным ... я что-то делаю не так?

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

Ответы [ 2 ]

6 голосов
/ 19 ноября 2010

Это не «в памяти» -% @ заставляет сообщение вызываться по dict, и это сортирует его. Перечисление предназначено для того, чтобы предоставить вам самый быстрый и простой доступ к содержимому. Если вам нужно отсортировать, вы должны отсортировать.

Взгляните на этот бесплатный отсортированный словарь для Objective-C

http://code.google.com/p/cocoa-sorted-dictionary/

2 голосов
/ 19 ноября 2010

Поскольку первый сортирует массив именно так, как вы описываете, чтобы пользователю / программисту было легче находить вещи. Однако вы получите порядок итераций, если будете использовать нижний уровень CFCopyDescription(dict).

Исходный код для коллекций CoreFoundation: доступен , хотя и без интерфейса Objective-C. NSDictionary / CFDictionary и NSSet / CFSet основаны на CFBasicHash, что неудивительно для хеш-таблицы. CFCopyDescription() и быстрый цикл итерации по элементам в порядке памяти (CFBasicHashApply() и CFBasicHashGetBucket() в CFBasicHash.m). Фактическое упорядочение предназначено для быстрого поиска на основе хеширования. Если вы не знакомы с хеш-таблицами, см. Википедия .

...