按值排序哈希然后按键排序(但键是相反的)

标题说明了一切。

total = {"Bob"=>37, "Alice"=>42, "Carl"=>42} 

我想按值排序,然后按键排序,但按键降序排序。

像这样:

 {"Bob"=>37, "Carl"=>42, "Alice"=>42} 

我试过了:

 return total.sort_by { |k, v| [v, k] } 

但是从这里我不知道如何扭转k

使用排序 :

 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} 

首先,按值排序( v1 <=> v2 )然后按键反向排序( k2 <=> k1 ),因为我们需要它同时将它放入数组中。

编辑:@ Mirror318,看起来很可怕,看看这里的优秀解释: 什么是Ruby <=>(太空船)运营商?

其他方式:

 total.sort_by { |k,v| [-v,k] }.reverse #=> [["Bob", 37], ["Carl", 42], ["Alice", 42]] 

如果你正在使用ruby> = 2.1,那么只需在排序的元组数组上调用to_h

 total = {"Bob"=>37, "Alice"=>42, "Carl"=>42} total.sort_by{|k, v| [v, k]}.to_h 

否则请致电Hash.new

 total = {"Bob"=>37, "Alice"=>42, "Carl"=>42} Hash.new total.sort_by{|k, v| [v, k]}.to_h