基于值对ruby中的哈希进行排序,然后键入

时间:2010-12-13 02:14:26

标签: ruby sorting

如何根据值然后键来对ruby中的哈希值进行排序?例如

h = {4 => 5, 2 => 5, 7 => 1}

将排序

[[7, 1], [2,5], [4, 5]]

我可以通过执行

来根据值进行排序
h.sort {|x,y| x[1] <=> y[1]}

但我无法弄清楚如何根据值进行排序,然后在值相同的情况下键入

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)