Home » Ruby » Descending sort by value of a Hash in Ruby

# Descending sort by value of a Hash in Ruby

Questions:

My input hash: `h = { "a" => 20, "b" => 30, "c" => 10 }`

Ascending sort: `h.sort {|a,b| a<=>b} #=> [["c", 10], ["a", 20], ["b", 30]]`

But, I need `[["b", 30], ["a", 20], ["c", 10]]`

How is can we make it work the other way around, what does `<=>` mean?

You can have it cleaner, clearer and faster, all at once! Like this:

``````h.sort_by {|k,v| v}.reverse
``````

I benchmarked timings on 3000 iterations of sorting a 1000-element hash with random values, and got these times:

``````h.sort {|x,y| -(x<=>y)} -- 16.7s
h.sort {|x,y| y <=> x} -- 12.3s
h.sort_by {|k,v| -v} -- 5.9s
h.sort_by {|k,v| v}.reverse -- 3.7
``````

Questions:
``````h.sort {|a,b| b<=>a}
`<=>` compares the two operands, returning -1 if the first is lower, 0 if they’re equal and 1 if the first is higher. This means that you can just do `-(a<=>b)` to reverse the order.
Super simple: `h.sort_by { |k, v| -v }`