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

时间:2010-03-29 18:50:29

标签: 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会出现在列表的第一位。当试图表明谁拥有最高统计数时,这让我的生活变得困难。 :)

关于如何按数值大小对哈希(或数组求偶)进行排序的任何想法?

我感谢任何帮助。

4 个答案:

答案 0 :(得分:256)

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

在任何情况下(按照Mladen),最好的方法是:

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}

答案 1 :(得分:80)

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

metrics.sort_by(&:last)

答案 2 :(得分:14)

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

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

沿途转换为字符串,这将完成工作。

答案 3 :(得分:9)

这不是我所看到的行为:

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]]

是否有可能沿着这条线的某个地方将你的数字转换成字符串?是否有更多代码没有发布?