私はアルファベットのすべての文字を別の文字(長さ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のハッシュテーブルに何らかのリンクリストを追加し、非ランダムな順序で要素をトラバースすることができました。