如何根据值然后键来对ruby中的哈希值进行排序?例如
h = {4 => 5, 2 => 5, 7 => 1}
将排序
[[7, 1], [2,5], [4, 5]]
我可以通过执行
来根据值进行排序h.sort {|x,y| x[1] <=> y[1]}
但我无法弄清楚如何根据值进行排序,然后在值相同的情况下键入
答案 0 :(得分:14)
h.sort_by {|k, v| [v, k] }
这使用Array
混合Comparable
并定义<=>
元素的事实。
请注意,上述内容相当于
h.sort_by {|el| el.reverse }
相当于
h.sort_by(&:reverse)
可能会或可能不会更具可读性。
如果您知道 Hash
es通常先按键排序,那么按值,上面应该是显而易见的。也许只是一个小评论:
h.sort_by(&:reverse) # sort by value first, then by key
注意:如果您只想委托某个属性的<=>
方法(即按键而不是一般比较函数排序),通常优先使用sort_by
代替sort
。它更容易阅读。通常,它也恰好更快,但可读性方面更重要。
如果绝对必要,你应该只编写自己的比较函数。
因此,您的非工作示例最好写成
h.sort_by {|el| el[1] }
就个人而言,我更喜欢在块参数列表中使用destructuring bind,而不是使用el[0]
和el[1]
:
h.sort_by {|key, value| value }
但是,在这种特殊情况下,el[1]
也恰好与el.last
相同,因此您只需编写
h.sort_by(&:last)