如何按数字值sortingRuby哈希?

我有一个计数器散列,我试图通过计数sorting。 我遇到的问题是默认的Hash.sort函数将stringsorting而不是数字大小。

即给定散列:

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

运行这个代码:

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

将返回一个sorting的数组:

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

即使745是比9更大的数字,9将首先出现在列表中。 当试图显示谁是最高的人数,这使我的生活困难。 🙂

任何想法如何sorting哈希(或数组,甚至)的数值大小?

我感谢任何帮助。

不知道如何得到你的结果,因为它不会按string值sorting…你应该在你的例子中反转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} 

由于价值是最后一项,你可以做:

 metrics.sort_by(&:last) 

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

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

转化为string或不,这将做的工作。

这不是我看到的行为:

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

你的电话号码正在被转换成string吗? 有没有更多的代码你没有发布?