Descending sort by value of a Hash in Ruby Descending sort by value of a Hash in Ruby ruby ruby

Descending sort by value of a Hash in Ruby


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[1]<=>y[1])} -- 16.7sh.sort {|x,y| y[1] <=> x[1]} -- 12.3sh.sort_by {|k,v| -v} -- 5.9sh.sort_by {|k,v| v}.reverse -- 3.7


h.sort {|a,b| b[1]<=>a[1]}


<=> 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[1]<=>b[1]) to reverse the order.