我有一个计数器哈希,我试图按计数排序。我遇到的问题是默认的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会出现在列表的第一位。当试图表明谁拥有最高统计数时,这让我的生活变得困难。 :)
关于如何按数值大小对哈希(或数组求偶)进行排序的任何想法?
我感谢任何帮助。
答案 0 :(得分:256)
不知道你是如何得到你的结果的,因为它不会按字符串值排序......你应该在你的例子中反转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}
答案 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]]
是否有可能沿着这条线的某个地方将你的数字转换成字符串?是否有更多代码没有发布?