【问题标题】:How to sort a Ruby Hash by number value?如何按数值对 Ruby 哈希进行排序?
【发布时间】:2011-02-02 04:23:46
【问题描述】:

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

关于如何按数值大小对哈希(甚至数组)进行排序有什么想法吗?

感谢您的帮助。

【问题讨论】:

  • 你使用什么 ruby​​ 版本?你的排序结果很奇怪

标签: ruby hash


【解决方案1】:

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

【讨论】:

  • 或者干脆sort_by{|k,v| v}
  • 我的号码以字符串形式返回,这已解决。我按顺序排列了 a2 和 a1,因为我希望结果按降序排列。不过,感谢您的反馈。
  • 这就是我喜欢 Ruby 的原因......这样的问题在其他语言中是头疼的。这么简单
  • @Elchin:你可以使用metrics.sort_by{ |k, v| v }.reverse.to_h
  • 实际上甚至更简单:hash.sort_by(&:last) 与获取对数组与哈希的相同警告。
【解决方案2】:

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

metrics.sort_by(&:last)

【讨论】:

【解决方案3】:

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

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

一路上是否转换为字符串,这将完成这项工作。

【讨论】:

    【解决方案4】:

    这不是我看到的行为:

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

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

    【讨论】:

    • 啊,你的权利,看起来我的代码中的结果是作为字符串返回的。讨厌的数据类型。 :) 有时我离问题太近了。谢谢。
    • 是的。偶尔我听到有人将 Ruby 称为“无类型”。哦,不,它肯定是打字的。它只是不是静态类型的。 :)
    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多