Подтвердить что ты не робот

Является ли Objective-C словарь заказанным контейнером?

как заголовок, когда я вставляю элемент в словарь в objective-c (в порядке, таком как: k1, k2, k3), есть ли какая-либо гарантия, что когда я перечисляю его так:

for ( k in dictionary ){
   // output the k - value
}

он будет отображаться в том же порядке?

4b9b3361

Ответ 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];