2016-05-18 2 views
-4

У меня есть эти два словаря:Быстрые словари автоматически сортируются?

let test = ["Tomorrow": "Bla", "Month": "Bla"] 
print(test) // ["Tuesday": "Bla", "Month": "Bla"] 

let test1 = ["Tomorrow": "Bla", "One Month": "Bla"] 
print(test2) // ["One Month": "Bla", "Tuesday": "Bla"] 

кажется, что если я использовать ключевое слово «один» элемент получает помещается впереди. Зачем?

+7

словари не заказываются, порядок, который вы * видите * имеет ** абсолютно никакого значения ** .. – luk2302

+2

Уже спрашивали тысячу раз, пожалуйста, исследуйте, прежде чем спрашивать. Словари не упорядочены. – Moritz

+1

@ luk2302 и @EricD - вы оба должны быть более конкретными. На самом деле, есть _ordered_ ассоциативные контейнеры и _unordered_ ассоциативные контейнеры. Это просто внутренняя реализация (через хэш-таблицы), которая делает Swift 'Dictionary' и Objective-C' NSDictionary' неупорядоченным контейнером. – CouchDeveloper

ответ

1

Swift's Dictionary - это структура данных, основанная на хеше. Если конкретный механизм упорядочения не находится в месте, порядок элементов в хэш-структур на основе, зависит от нескольких факторов:

  • хэш-значения объектов, используемых в качестве ключей - hashValue метод используется для определения количества ковша для пункт
  • размера структуры - так как hashValue может быть значительно больше, чем количество ковшей доступных, ограничивающий механизм, например, по модулю подсчета ковша, используется для определения фактического количества ковша
  • Модификация заказ - это становится актуальным, когда ключи имеют коллизии. Элементы с повторяющимся значением хэша, расположенным позже, либо переходят в другое ведро, либо помещаются в список, связанный с фактическим ведром.

Например, если изменить размер словаря в вашем втором примере, порядок элементов будет обратным:

var test1 = [String:String]() // Use default initial capacity 
test1["Tomorrow"] = "Bla" 
test1["One Month"] = "Bla" 
print(test1) // ["One Month": "Bla", "Tomorrow": "Bla"] 

var test2 = [String:String](minimumCapacity: 11) // Use specific capacity 
test2["Tomorrow"] = "Bla" 
test2["One Month"] = "Bla" 
print(test2) // ["Tomorrow": "Bla", "One Month": "Bla"] 

Поскольку некоторые из этих параметров находятся вне вашего контроля, порядок элементов в a Dictionary можно считать произвольным для всех практических целей.

+0

Спасибо за объяснение! –

Смежные вопросы