如何按数值对 Ruby Hash 排序?

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

即给定哈希:

metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 }

运行以下代码:

metrics.sort {|a1,a2| a2[1]<=>a1[1]}

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

[ 'siteb.com', 9, 'sitea.com', 745, 'sitec.com', 10]

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

对于如何根据数值大小对散列(或数组偶数)进行排序有什么想法吗?

谢谢你的帮助。

140313 次浏览

不知道如何得到结果,因为它不会按字符串值排序... ... 您应该在示例中反转 a1a2

无论如何,最好的办法是:

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 + 中)

metrics.sort_by {|_key, value| value}.to_h
# ==> {"siteb.com" => 9, "sitec.com" => 10, "sitea.com", 745}

我看到的可不是这样:

irb(main):001:0> metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" =>
10 }
=> {"siteb.com"=>9, "sitec.com"=>10, "sitea.com"=>745}
irb(main):002:0> metrics.sort {|a1,a2| a2[1]<=>a1[1]}
=> [["sitea.com", 745], ["sitec.com", 10], ["siteb.com", 9]]

有没有可能在这条线的某个地方你的数字被转换成了字符串?你还有什么代码没发布吗?

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

metrics.sort {|a1,a2| a2[1].to_i <=> a1[1].to_i }

无论是否转换成字符串,这都能完成任务。

因为 value 是最后一个条目,所以可以这样做:

metrics.sort_by(&:last)