【发布时间】:2016-01-01 11:08:04
【问题描述】:
标题说明了一切。
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}
我想按值排序,然后按键,但键按降序排列。
像这样:
{"Bob"=>37, "Carl"=>42, "Alice"=>42}
我试过了:
return total.sort_by { |k, v| [v, k] }
但是从这里我不知道如何反转k...
【问题讨论】:
使用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?
【讨论】:
sort_by { |x| x } 大致相当于sort { |a, b| a <=> b }。相应地扩展您的代码,您几乎可以得到答案。
另一种方式:
total.sort_by { |k,v| [-v,k] }.reverse.to_h
#=> {"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
【讨论】: