Rubyハッシュをキーでアルファベット順に並べ替える方法



How Sort Ruby Hash Alphabetically Keys



解決:

ソートされた順序でキーを反復処理するハッシュを出力にしたい場合は、ほぼそこにあります。Hash#sort_byはの配列配列、および内部配列はすべて2つの要素です。

ルビーのハッシュには、この出力を使用できるコンストラクターがあります。



これを試して:

temp = Hash [temp.sort_by]

以上簡潔に



temp = temp.sort_by .to_h

ハッシュにキータイプが混在している場合、これは機能しません(Rubyは自動的にソートしません)文字列とたとえば記号)とすると、次のようなエラーメッセージが表示されます。 記号と文字列の比較に失敗しました(ArgumentError) 。もしそうなら、あなたは上記を変更することができます

temp = Hash [temp.sort_by key.to_s]

問題を回避します。ただし、キーは元のタイプを保持するため、後のコードでの仮定に問題が生じる可能性があることに注意してください。また、ほとんどの組み込みクラスは、.to_sメソッドであるため、そこから望ましくない結果が得られる可能性があります(数値キーの予期しない並べ替え順序、またはその他の予期しないタイプなど)。

あなたは出来る、 更に 、キーをに変換します次のような文字列:



temp = Hash [temp.map key、val.sort]

。 。 。ただし、このアプローチでは元のキーのタイプに関する情報が失われ、元のデータを確実に参照することができなくなります。


sort_by_key = Hash [original_hash.sort]

のキー/値を挿入して新しいハッシュを作成しますoriginal_hashをキーのアルファベット順に並べます。 Ruby 2.xハッシュは挿入順序を記憶しているため、この新しいハッシュは、列挙または出力すると、キーでソートされて表示されます。

アルファベット以外の順序でさらに要素を挿入すると、もちろんこれは当てはまりません。

また、これは、元のハッシュキーがすべてソート可能/比較可能であることを前提としています。


Ruby's Hashは現在、その挿入順序を覚えていますが、以前のRubiesは

これは、シーケンシャル/テキストファイル、チェーン、またはキューのように機能する配列とは異なり、配列を反復処理して線形にアクセスする必要があります。その時点で、要素の順序によって大きな違いが生じます。

したがって、ハッシュを使用して、キーを取得し、並べ替えて、キーのリストを反復処理するか、を使用します。values_atを使用して、すべての値を一度に取得します。例えば:

hash = {'z' => 9、 'a' => 1} sorted_keys = hash.keys.sort#=> ['a'、 'z'] sorted_keys.each do | k | puts hash [k] end#>> 1#>> 9 hash.values_at(* sorted_keys)#=> [1、9]

一部の言語ではハッシュを並べ替えることさえできず、並べ替えられたキーのリストを介してアクセスすることが要素を順番に抽出する唯一の方法であるため、次の順序に依存する習慣を身に付けないことをお勧めします。キーと値のペアであり、代わりにキーに依存します。