【问题标题】:How do I sort an array of hashes by a value in the hash?如何按哈希中的值对哈希数组进行排序?
【发布时间】:2011-03-10 09:46:14
【问题描述】:

这段 Ruby 代码的行为与我预期的不同:

# create an array of hashes
sort_me = []
sort_me.push({"value"=>1, "name"=>"a"})
sort_me.push({"value"=>3, "name"=>"c"})
sort_me.push({"value"=>2, "name"=>"b"})

# sort
sort_me.sort_by { |k| k["value"]}

# same order as above!
puts sort_me

我希望通过键“值”对哈希数组进行排序,但它们未排序。

【问题讨论】:

    标签: ruby arrays sorting hash


    【解决方案1】:

    Ruby 的sort 没有就地排序。 (也许你有 Python 背景?)

    Ruby 有sort! 用于就地排序,但在Ruby 1.8 中没有sort_by 的就地变体。在实践中,您可以这样做:

    sorted = sort_me.sort_by { |k| k["value"] }
    puts sorted
    

    从 Ruby 1.9+ 开始,.sort_by! 可用于就地排序:

    sort_me.sort_by! { |k| k["value"]}
    

    【讨论】:

    • 实际上,Array#sort_by! 是 Ruby 1.9.2 中的新功能。今天适用于所有 Ruby 版本,需要我的 backports gem :-)
    • 你好,有没有降序排序的方法?我想我可能想去3,2,1...
    • 你不能用 sort_by 做到这一点,但使用 sortsort! 并简单地翻转操作数:a.sort! {|x,y| y <=> x } (ruby-doc.org/core-1.9.3/Array.html#method-i-sort)
    • 或:puts sorted = sort_me.sort_by{ |k,v| v }
    • @tekknolagi:只需附加.reverse
    【解决方案2】:

    按照@shteef,但按照建议使用sort! 变体实现:

    sort_me.sort! { |x, y| x["value"] <=> y["value"] }
    

    【讨论】:

      【解决方案3】:

      虽然 Ruby 没有 sort_by 就地变体,但您可以这样做:

      sort_me = sort_me.sort_by { |k| k["value"] }
      

      Array.sort_by! 在 1.9.2 中添加

      【讨论】:

      • 这个“Array.sort_by!是在 1.9.2 中添加的”答案对我有用
      【解决方案4】:

      您可以使用sort_me.sort_by!{ |k| k["value"]}。这应该有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-27
        • 1970-01-01
        • 2020-04-05
        • 1970-01-01
        • 1970-01-01
        • 2010-10-20
        相关资源
        最近更新 更多