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

Dus*_* M. 151 ruby hash

我有一个计数器哈希,我试图按计数排序.我遇到的问题是默认的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)

  • 或者只是`sort_by {| k,v | V}` (83认同)
  • @Elchin:你可以使用`metrics.sort_by {| k,v | v..reverse.to_h` (15认同)
  • 实际上甚至更简单:hash.sort_by(&:last)与获得一对数组和一个哈希相同的警告. (4认同)
  • 对于反向排序,您可以使用 `metrics.sort_by{|k,v| -v}` (3认同)

sho*_*one 82

由于value是最后一个条目,您可以:

metrics.sort_by(&:last)
Run Code Online (Sandbox Code Playgroud)

  • 这太棒了!对于'&:last`的预定义的任何引用? (4认同)
  • `sort_by(&amp;:last)` 是 `sort_by {|x| 的有效简写 x.last}` /sf/ask/85196191/ (2认同)

dim*_*rvp 14

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

metrics.sort {|a1,a2| a2[1].to_i <=> a1[1].to_i }
Run Code Online (Sandbox Code Playgroud)

一路上转换为字符串与否,这将完成工作.


Jac*_*son 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]]
Run Code Online (Sandbox Code Playgroud)

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

  • 是的。偶尔我听到有人将 Ruby 称为“无类型”。哦,不,它肯定是打字的。它只是不是静态类型的。:) (2认同)