如何按数字值对Ruby哈希排序?


154

我有一个计数器哈希,尝试按计数排序。我遇到的问题是默认的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仍将出现在列表的第一位。当试图显示谁拥有最高职位时,这使我的生活变得困难。:)

关于如何通过数字值大小对哈希(甚至是数组)进行排序的任何想法?

感谢您的帮助。


您使用什么红宝石版本?您的排序结果非常奇怪
fl00r 2010年

Answers:


268

不知道如何得到结果,因为它不会按字符串值排序...您应该反转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}

84
还是简单地sort_by{|k,v| v}
MladenJablanović10年

我的数字以字符串形式返回,并固定了它。.我有a2和a1的顺序,因为我希望结果按降序排序..不过,感谢您的反馈。
Dustin M.

这就是为什么我爱Ruby的原因。这种问题在其他语言中令人头疼。如此简单
Hady Elsahar

18
@Elchin:您可以使用metrics.sort_by{ |k, v| v }.reverse.to_h
马克-安德烈·Lafortune

4
实际上甚至更简单:hash.sort_by(&:last)关于获得数组对与哈希的相同警告。
格里·格里森


14

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

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

是否沿途转换为字符串,都可以完成工作。


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

您的数字是否有可能被转换为字符串?您还没有发布更多代码吗?


啊,对了,我的代码中的结果似乎是以字符串形式返回的。讨厌的数据类型。:)有时我太接近问题了。谢谢。
Dustin M.

1
对。有时我听到有人称Ruby为“未类型化”。哦,不,它肯定是键入的。它不是静态输入的。:)
Jacob Mattison 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.