- 公開日
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}