你如何根据值然后键来对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)
| 归档时间: |
|
| 查看次数: |
5649 次 |
| 最近记录: |