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

时间:2015-09-16 08:33:47

标签: ruby sorting

标题说明了一切。

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

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

像这样:

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

我试过了:

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

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

3 个答案:

答案 0 :(得分:5)

使用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}

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

编辑:@ Mirror318,看起来很吓人,看看这里的优秀解释:What is the Ruby <=> (spaceship) operator?

答案 1 :(得分:2)

另一种方式:

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

答案 2 :(得分:-1)

如果您使用的是ruby&gt; = 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