1. ホーム
  2. ruby

[解決済み] RubyのHashをキーでアルファベット順にソートする方法

2022-02-10 07:06:31

質問

Hashをアルファベット順にキーでソートしたいのですが、独自のSortingクラスを作成しないと方法が見つからないようです。以下のコードで、整数の場合は値でソートすることを発見しました。

temp["ninjas"]=36
temp["pirates"]=12
temp["cheese"]=222
temp.sort_by { |key, val| key }

私の目標は、Hashをキーで並べ、その値を出力することです。同じ値で異なるハッシュの順序で何度も実行する必要があります。

どのように解決するのですか?

ソートされた順にキーを反復するハッシュを出力したいのであれば、もう少しで完了です。 Hash#sort_byArrayArray であり、内側の配列はすべて2要素である。

Rubyの Hash には、この出力を消費するコンストラクタがあります。

これを試してみてください。

temp = Hash[ temp.sort_by { |key, val| key } ]

またはもっと簡潔に

temp = temp.sort_by { |key| key }.to_h

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

temp = Hash[ temp.sort_by { |key, val| key.to_s } ] 

を使用して、この問題を回避することができます。しかし、キーは元の型を保持したままなので、後のコードで仮定に問題が生じる可能性があることに注意してください。また、ほとんどの組み込みクラスは .to_s メソッドを使用すると、予期しない結果 (数値キーの予期しないソート順や、予期しない型など) を得る可能性があります。

できるはずです。 さらに に変換します。 Strings というような内容で。

temp = Hash[ temp.map { |key, val| [key.to_s, val] }.sort ] 

. しかし、この方法では、元のキーのタイプに関する情報が失われるため、元のデータを確実に参照することは不可能です。