The title says it all.
total = {\"Bob\"=>37, \"Alice\"=>42, \"Carl\"=>42}
I want to sort it by value, and then by key, but with th
Another way:
total.sort_by { |k,v| [-v,k] }.reverse.to_h
#=> {"Bob"=>37, "Carl"=>42, "Alice"=>42}
Use sort:
total = {"Bob"=>37, "Alice"=>42, "Carl"=>42}
total.sort { |(k1, v1), (k2, v2)| [v1, k2] <=> [v2, k1] }.to_h
# => {"Bob"=>37, "Carl"=>42, "Alice"=>42}
First, sort by values (v1 <=> v2
) and then reverse sort by keys (k2 <=> k1
), and since we need it simultaneously, put it into array.
EDIT: @Mirror318, it just looks scary, take a look at the excellent explanation here: What is the Ruby <=> (spaceship) operator?
If you're using ruby >= 2.1, then just call to_h
on sorted array of tuples:
total = {"Bob"=>37, "Alice"=>42, "Carl"=>42}
total.sort_by{|k, v| [v, k]}.to_h
Else call Hash.new
:
total = {"Bob"=>37, "Alice"=>42, "Carl"=>42}
Hash.new total.sort_by{|k, v| [v, k]}.to_h