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

Ben*_*Ben 5 ruby sorting

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

h = {4 => 5, 2 => 5, 7 => 1}
Run Code Online (Sandbox Code Playgroud)

会陷入困境

[[7, 1], [2,5], [4, 5]]
Run Code Online (Sandbox Code Playgroud)

我可以根据价值进行排序

h.sort {|x,y| x[1] <=> y[1]}
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何基于值进行排序,然后键入值是否相同

Jör*_*tag 14

h.sort_by {|k, v| [v, k] }
Run Code Online (Sandbox Code Playgroud)

这使用Array混合的事实Comparable并定义<=>元素.

注意,上面相当于

h.sort_by {|el| el.reverse }
Run Code Online (Sandbox Code Playgroud)

这相当于

h.sort_by(&:reverse)
Run Code Online (Sandbox Code Playgroud)

这可能是也可能不是更具可读性.

如果您知道Hash用钥匙平时上课先排序,然后按价值计算,上述应该是显而易见的.也许只是一个小评论:

h.sort_by(&:reverse) # sort by value first, then by key
Run Code Online (Sandbox Code Playgroud)

注意:如果您只想委托某个属性的<=>方法(即按键而不是一般比较函数排序),通常优先使用sort_by而不是sort.它更容易阅读.通常,它也恰好更快,但可读性方面更重要.

如果绝对必要,你应该只编写自己的比较函数.

所以,你的非工作的例子最好写成

h.sort_by {|el| el[1] }
Run Code Online (Sandbox Code Playgroud)

就个人而言,我更喜欢在块参数列表中使用destructuring bind,而不是使用el[0]el[1]:

h.sort_by {|key, value| value }
Run Code Online (Sandbox Code Playgroud)

但是,在这种特殊情况下,el[1]也恰好相同el.last,所以你可以简单地写

h.sort_by(&:last)
Run Code Online (Sandbox Code Playgroud)