如何按数字值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…你应该在你的例子中反转a1
和a2
无论如何,最好的方法是(根据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吗? 有没有更多的代码你没有发布?