首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何按数值对Ruby Hash进行排序?

如何按数值对Ruby Hash进行排序?
EN

Stack Overflow用户
提问于 2010-03-30 02:50:29
回答 4查看 130.2K关注 0票数 165

我有一个计数器散列,我正在尝试按计数排序。我遇到的问题是,默认的Hash.sort函数像字符串一样对数字进行排序,而不是按数字大小排序。

例如,给定Hash:

代码语言:javascript
复制
metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 }

运行以下代码:

代码语言:javascript
复制
metrics.sort {|a1,a2| a2[1]<=>a1[1]}

将返回一个已排序的数组:

代码语言:javascript
复制
[ 'siteb.com', 9, 'sitea.com', 745, 'sitec.com', 10]

尽管745是一个大于9的数字,但9将出现在列表中的第一位。当试图展示谁拥有最多的数量时,这让我的生活变得困难。:)

关于如何按数值大小对散列(甚至数组)进行排序,您有什么想法吗?

我很感谢你的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-30 02:55:53

不知道您是如何获得结果的,因为它不会按字符串值排序...您应该在示例中颠倒a1a2

在任何情况下(根据Mladen)最好的方法是:

代码语言:javascript
复制
metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 }
metrics.sort_by {|_key, value| value}
  # ==> [["siteb.com", 9], ["sitec.com", 10], ["sitea.com", 745]]

如果你需要一个哈希作为结果,你可以使用to_h (在Ruby 2.0+中)

代码语言:javascript
复制
metrics.sort_by {|_key, value| value}.to_h
  # ==> {"siteb.com" => 9, "sitec.com" => 10, "sitea.com", 745}
票数 288
EN

Stack Overflow用户

发布于 2013-04-07 18:59:29

由于value是最后一个条目,因此您可以执行以下操作:

代码语言:javascript
复制
metrics.sort_by(&:last)
票数 92
EN

Stack Overflow用户

发布于 2010-03-30 17:10:49

已经回答了,但仍在回答。将您的代码更改为:

代码语言:javascript
复制
metrics.sort {|a1,a2| a2[1].to_i <=> a1[1].to_i }

无论是否在整个过程中转换为字符串,这都可以完成工作。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2540435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档