/ /ルビのハッシュをランダムな順序で並べます - ルビ、配列、ハッシュ、ジップ

ルビのハッシュをランダムな順序で並べ替える - ルビ、配列、ハッシュ、ジップ

私はアルファベットのすべての文字を別の文字(長さ1の文字列)とマッチさせるコードを書いて、その2つをハッシュに変換しました:

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

[印刷方法は他のハッシュで正しく動作し、私の知るところでは正しい]

だから:どのように私はキーの元の順序を維持しながら配列を "ジッパー"できますか?

回答:

回答№1の場合は3

順序付けされたハッシュについての答えは正しいが、あなたの場合、必ずしも キープ 順番にハッシュ、あなたはあなたの出力のためにそれを並べ替えることができます。

puts hash.sort.transpose.map(&:join)

回答№2の場合は3

Ruby 1.9.xで使用できるソート済みハッシュです。 Ruby 1.8.7でハッシュは未定義です

APIから:

A Hash キーと値のペアの集合です。これは、 Arrayただし、インデックス作成は任意のキーを使用して行われます整数型インデックスではなく、任意のオブジェクト型です。キーまたは値のいずれかによってハッシュをトラバースする順序は、任意であるように見えますが、一般的には挿入順序にはありません。


回答№3の場合は1

それは zip、それは Hash それは問題です。

ハッシュテーブルの定期刊行物(コンピュータサイエンス)は、データが挿入された順序(または他のソート順)について、それが知りたいと思っているすべてのものを検索しているわけではありません。ハッシュテーブルをトラバースしてその中のすべてを見る場合は、要素が格納されているバケットの順番で要素をトラバースすることになります。これは通常、ハッシュ関数のモジュロです。良いハッシュ関数では、それは本質的にランダムな順序です。

Ruby 1.8では、これがハッシュテーブルの実装方法です。

人々がハッシュを期待していることを理解する要素の順序を覚えていれば、Ruby開発者は、Ruby 1.9のハッシュテーブルに何らかのリンクリストを追加し、非ランダムな順序で要素をトラバースすることができました。