Положение пар ключ / значение в хэше в Ruby (или любом другом языке)

Я слышал, что позиции пар ключ-значение в хэше не фиксированы и могут быть переставлены.

Я хотел бы знать, правда ли это, и если это так, может ли кто-нибудь указать мне какую-то документацию? Если это неправильно, было бы здорово иметь некоторую документацию об обратном.

Для иллюстрации, если у меня есть следующий хэш:

   NUMBERS = {
             1000 => "M",
             900 => "CM",
             500 => "D",
             400 => "CD",
             100 => "C",
             90 => "XC",
             50 => "L",
             40 => "XL",
             10 => "X",
             9 => "IX",
             5 => "V",
             4 => "IV",
             1 => "I",
           }

и повторять его снова и снова, будет ли первая пара ключ / значение, возможно, не 1000 => 'M'? Или же позиции пар ключ / значение фиксированы по определению, и их придется менять вручную, чтобы изменить позиции?

Этот вопрос является более общим и основным вопросом о качествах хэшей. Я не спрашиваю, как добраться до определенной позиции в хеше.

2 ответа

Решение

Обычно хеши (или словари, ассоциативные массивы и т. Д.) Считаются неупорядоченными структурами данных.

Из Википедии

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

Однако начиная с Ruby 1.9 хеш-ключи поддерживают порядок, в котором они были вставлены в Ruby.

Ответ находится прямо вверху документации Ruby дляHash

Хэши перечисляют свои значения в том порядке, в котором были вставлены соответствующие ключи.

В Ruby вы можете легко проверить это сами

key_indices = {
  1000 => 0,
  900  => 1,
  500  => 2,
  400  => 3,
  100  => 4,
  90   => 5,
  50   => 6,
  40   => 7,
  10   => 8,
  9    => 9,
  5    => 10,
  4    => 11,
  1    => 12
}

1_000_000.times do
  key_indices.each_with_index do |key_val, i|
    raise if key_val.last != i
  end
end

Хеш (также называемый ассоциативным массивом) - это неупорядоченная структура данных. Начиная с Ruby 1.9, Ruby сохраняет порядок ключей, хотя и вставленный.

Вы можете найти намного больше об этом здесь: Гарантирован ли порядок литерала хеша Ruby?

И некоторые здесь https://ruby-doc.org/core-2.4.1/Hash.html

Другие вопросы по тегам