公開日

RubyでHashのKey/Valueをソートする

目次

RubyでHashのKey/Valueをソートするにはどうしたらよいでしょうか。

ベースとなるHashデータ

今回ソートの対象となるベースとなるHashデータは下記のとおりです。

> h = { c: -10, z: 10, b: -5, y: 5, a: -1, x: 1 }
=> {:c=>-10, :z=>10, :b=>-5, :y=>5, :a=>-1, :x=>1}

HashのKeyをソート

HashのKeyを昇順にソート

HashのKeyのソートであれば素直に sort を呼べばいけます。

> h.sort
=> [[:a, -1], [:b, -5], [:c, -10], [:x, 1], [:y, 5], [:z, 10]]

ただこのままだとArrayのかたちなので、再びHashに戻すためにto_hを付けてHashに戻してやりましょう。

> h.sort.to_h
=> {:a=>-1, :b=>-5, :c=>-10, :x=>1, :y=>5, :z=>10}

HashのKeyを降順にソート

では次に降順にソートです。reverseでいけます。

> h.sort.reverse
=> [[:z, 10], [:y, 5], [:x, 1], [:c, -10], [:b, -5], [:a, -1]]

> h.sort.reverse.to_h
=> {:z=>10, :y=>5, :x=>1, :c=>-10, :b=>-5, :a=>-1}

HashのValueをソート

HashのValueを昇順にソート

次にHashのValueはどうでしょうか? sort_by を使えばいけます。

> h.sort_by { |_, v| v }
=> [[:c, -10], [:b, -5], [:a, -1], [:x, 1], [:y, 5], [:z, 10]]

> h.sort_by { |_, v| v }.to_h
=> {:c=>-10, :b=>-5, :a=>-1, :x=>1, :y=>5, :z=>10}

HashのValueを降順にソート

降順はreverseを使ってこうです。

> h.sort_by { |_, v| v }.reverse.to_h
=> {:z=>10, :y=>5, :x=>1, :a=>-1, :b=>-5, :c=>-10}

ただ今回のHashデータのようにValueがIntegerの場合は、下記のほうがスマートです。

> h.sort_by { |_, v| -v }.to_h
=> {:z=>10, :y=>5, :x=>1, :a=>-1, :b=>-5, :c=>-10}