Является ли Objective-C словарь заказанным контейнером?
как заголовок, когда я вставляю элемент в словарь в objective-c (в порядке, таком как: k1, k2, k3), есть ли какая-либо гарантия, что когда я перечисляю его так:
for ( k in dictionary ){
// output the k - value
}
он будет отображаться в том же порядке?
Ответы
Ответ 1
Нет, NSDictionary
не поддерживает порядок вставки его ключей.
Если вам нужен словарь, который поддерживает порядок вставки, я бы предложил использовать структуру CHDataStructures, которая имеет класс CHOrderedDictionary
(it потомком NSMutableDictionary
). В документации для CHOrderedDictionary
говорится:
Словарь, который перечисляет ключи в том порядке, в котором они были вставлены.
Следующие дополнительные операции предоставляются, чтобы воспользоваться заказом:
-firstKey
-lastKey
-keyAtIndex:
-reverseKeyEnumerator
Ввод ключевых слов вставляется так же, как в обычном словаре, включая замену значений для существующих ключей, как описано в -setObject: forKey:. Тем не менее, дополнительная структура используется параллельно порядку размещения трека, и ключи перечисляются в этом порядке. Если в словаре нет ключа, который будет добавлен, он добавляется в конец списка, иначе порядок вставки ключа не изменяется.
Ответ 2
Ключи NSDictionary не сохраняются в порядке, но вы можете получить их и отсортировать, E. G:
for (key in [[myDict allKeys] sortedArrayUsingSelector:@selector(compare:)])
...
Ответ 3
Нет, он не упорядочен. Вы можете использовать массив ключей для запоминания заказа, если вам нужно, но словари представляют собой концептуально неупорядоченные пакеты пар ключ-значение.
Ответ 4
Что-то, что я хотел бы добавить, если кто-то ищет это и натыкается на этот поток:
Для упорядоченных словарей существует довольно простая работа, а также наличие массива, содержащего ключи в том порядке, в котором вы хотите. Затем, имея неупорядоченный словарь, но вы можете получить доступ к каждому ключу в порядке, используя ключи из массива:
NSString *key = [arrayOfKeys objectAtIndex:0];
NSString *stringAtIndexZero = [unorderedDictionary objectForKey:key];
Ответ 5
Я также видел это при поиске:
http://cocoawithlove.com/2008/12/ordereddictionary-subclassing-cocoa.html