【问题标题】:How to sort an array of hashes into hashes with multiple values for a key?如何将散列数组排序为具有多个键值的散列?
【发布时间】:2014-08-30 16:06:03
【问题描述】:

我正在使用 rails4 开发 Ruby on Rails 项目。

场景:

我有一个哈希数组。数组包含键相同的哈希。

 a = [{132=>[1000.0]}, {132=>[4000.0]}, {175=>[1000.0]}, {175=>[1000.0]}, {133=>[1200.0]}]
 h = a.each {|key,value| key.each {|k| value}}
#{132=>[1000.0]}
#{132=>[4000.0]}
#{175=>[1000.0]}
#{175=>[1000.0]}
#{133=>[1200.0]}

问题:

如何摆脱重复键,但将值添加到唯一键,如下所示:

 {132=>[1000,4000]}
 {175=>[1000,1000]}
 {133=>[1200]}

谢谢。

【问题讨论】:

    标签: ruby arrays hash


    【解决方案1】:

    这样就可以了:

    a.inject({}) {|sum, hash| sum.merge(hash) {|_, old, new| old + new }}
    

    【讨论】:

      【解决方案2】:

      这对我有用:

      p a.each_with_object(Hash.new([])) { |e, h| e.each { |k, v| h[k] += v } }
      
      # => {132=>[1000.0, 4000.0], 175=>[1000.0, 1000.0], 133=>[1200.0]}
      

      【讨论】:

      • 谢谢,我会考虑清楚的。
      • 您的意思是您喜欢通过设置默认哈希值来避免某个条件的可能性吗?=)。或者你暗示它可以用另一种方式完成?
      • 我没有很好地表达自己,但我的意思是我更喜欢Hash.new([])h[k] += v,而不是我认为的主要替代品:Hash.new {|h,k| h[k]=[]}h[k] << v.first。然而,经过反思,前者可能效率较低,因为在添加每个元素时都会创建一个新数组。嗯。您介意进行编辑,以便我可以回滚我的 +1 吗?实际上,(h[k] ||= []) <<... 可能会快很多。 (否决编辑请求。:-))。
      【解决方案3】:

      另一种方式:

      a.each_with_object({}) do |g,h|
        k, v = g.to_a.flatten
        (h[k] ||= []) << v
      end
        #=> {132=>[1000.0, 4000.0], 175=>[1000.0, 1000.0], 133=>[1200.0]}
      

      a.each_with_object(Hash.new { |h,k| h[k]=[] }) do |g,h|
        k, v = g.to_a.flatten
        h[k] << v
      end
        #=> {132=>[1000.0, 4000.0], 175=>[1000.0, 1000.0], 133=>[1200.0]}
      

      【讨论】:

      • 一如既往的好方法。
      • 谢谢,很有帮助。
      猜你喜欢
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 2014-01-08
      • 2014-07-03
      • 2010-09-26
      • 1970-01-01
      相关资源
      最近更新 更多