Ruby 1.8.7では、ハッシュ内の要素の順序は私たちの管理下にないことが文書化されているため、上記のメソッドはいずれも機能しません。Ruby 1.9.3では、物事は機能し、他の回答が依存する方法で文書化されています。
$ irb1.8
h = {"4" => "happiness"、 "10" => "cool"、 "lala" => "54"、 "1" => "spider"}
ハッシュ[h.to_a()。reverse()]
=> {"lala" => "54"、 "1" => "スパイダー"、 "10" => "クール"、 "4"=>"幸福"}
終了する
$ irb1.9.1
h = {"4" => "happiness"、 "10" => "cool"、 "lala" => "54"、 "1" => "spider"}
ハッシュ[h.to_a()。reverse()]
=> {"1" => "スパイダー"、"ララ"=>"54"、 "10" => "クール"、 "4"=>"幸せ"}
Ruby 1.8.7の方法は私にとって非常にしっかりと根付いていたので、私はかなり長い間質問を誤解していました。私はそれがHash#invertへの方法を要求したと思いました:すなわち、範囲がドメインにマップされるようにハッシュを変換します。そのメソッドは重複を破棄します。LuísRamalhoはそうではない方法を提案しますが、それは少し不格好です。これは少し短いです:
$ irb
def invertWithDuplicates(original)
reverse = Hash.new(){|ハッシュ、キー| hash [key] = []; }
original.each_pair(){|キー、値| reverse [value] .push(key); }
逆を返す
終わり
h = {"4" => "幸せ"、 "10" => "クール"、"ララ"=>"54"、 "1"=>"クール"}
invertWithDuplicates(h)
=> {"happiness" => ["4"]、 "cool" => ["1"、 "10"]、 "54" => ["lala"]}
OPの意図したトピックから逸脱して申し訳ありませんが、これは投稿のタイトル「Rubyでハッシュを逆にする」に適合していることを提出します。