我有一个计数器哈希,我试图按计数排序.我遇到的问题是默认的Hash.sort函数将数字排序为字符串而不是数字大小.
即鉴于哈希:
metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 }
Run Code Online (Sandbox Code Playgroud)
运行此代码:
metrics.sort {|a1,a2| a2[1]<=>a1[1]}
Run Code Online (Sandbox Code Playgroud)
将返回一个已排序的数组:
[ 'siteb.com', 9, 'sitea.com', 745, 'sitec.com', 10]
Run Code Online (Sandbox Code Playgroud)
尽管745的数字大于9,但9会出现在列表的第一位.当试图表明谁拥有最高统计数时,这让我的生活变得困难.:)
关于如何按数值大小排序哈希(或数组偶数)的任何想法?
我感谢任何帮助.
Mar*_*une 263
不知道你如何得到你的结果,因为它不会通过字符串值排序...你应该扭转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]]
Run Code Online (Sandbox Code Playgroud)
如果您需要哈希作为结果,您可以使用to_h
(在Ruby 2.0+中)
metrics.sort_by {|_key, value| value}.to_h
# ==> {"siteb.com" => 9, "sitec.com" => 10, "sitea.com", 745}
Run Code Online (Sandbox Code Playgroud)
sho*_*one 82
由于value是最后一个条目,您可以:
metrics.sort_by(&:last)
Run Code Online (Sandbox Code Playgroud)
dim*_*rvp 14
已经回答但仍然.将您的代码更改为:
metrics.sort {|a1,a2| a2[1].to_i <=> a1[1].to_i }
Run Code Online (Sandbox Code Playgroud)
一路上转换为字符串与否,这将完成工作.
那不是我所看到的行为:
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]]
Run Code Online (Sandbox Code Playgroud)
是否有可能沿着这条线的某个地方将你的数字转换成字符串?是否有更多代码没有发布?
归档时间: |
|
查看次数: |
114130 次 |
最近记录: |