Помещает рубиновый хеш в случайном порядке - PullRequest
1 голос
/ 29 марта 2011

Я написал код, который сопоставляет каждую букву алфавита с другим символом (строка длиной 1), и я превратил их в хеш:

Hash[String.alphabet.zip String.alphabet]
# String.alphabet returns an array with 0:A, 1:B, ... ,25:Z
# I take two times the alphabet to demonstrate

Но когда я печатаю хэш с

puts "#{hash.keys.join}\n#{hash.values.join}"

это дает мне

VKWLAXMBYNCZODPEQFRGSHTIUJ
VKWLAXMBYNCZODPEQFRGSHTIUJ

, который, будучи верным, трудно прочитать, если я хочу увидеть, правильно ли сопоставляются буквы, я бы предпочел вывод в виде

ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ

[Метод печати работает правильно на других хэшах и, насколько я знаю, корректен]

Итак: Как я могу «заархивировать» массивы, сохраняя исходный порядок ключей?

Ответы [ 3 ]

3 голосов
/ 29 марта 2011

Ответы об упорядоченных хешах верны, но в вашем случае вам не обязательно сохранять хеш в порядке, вы можете просто отсортировать его для вывода.

puts hash.sort.transpose.map(&:join)
3 голосов
/ 29 марта 2011

Сортированные хэши, которые вы можете использовать в Ruby 1.9.x. В Ruby 1.8.7 хеши не отсортированы

Из API:

A Hash представляет собой набор пар ключ-значение. Это похоже на Array, за исключением того, что индексация выполняется с помощью произвольных ключей любого типа объекта, а не целочисленного индекса. Порядок, в котором вы проходите хеш по ключу или значению, может показаться произвольным и, как правило, не соответствует порядку вставки.

1 голос
/ 29 марта 2011

Проблема не в zip, а в Hash.

Хеш-таблица обычно (в общем мире компьютерных наук) не отслеживает порядок вставки данных (или любой другой порядок сортировки) все, что он хочет знать, это поиск.Если вы хотите просмотреть хеш-таблицу, чтобы увидеть все, что в ней находится, вы в конечном итоге пройдете элементы в порядке сегментов, в которых они хранятся.Обычно это по модулю хэш-функции.С хорошей хэш-функцией это по сути случайный порядок.

В Ruby 1.8 так реализованы хеш-таблицы.

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

...