如何在哈希中汇总所有深层嵌套的值

时间:2015-01-16 07:32:21

标签: ruby hash sum

我有一个哈希:

hash = {"0"=>{"0"=>"148", "1"=>"2", "2"=>"90", ....}, "1"=>{"0"=>10}, .....}

我想添加所有深层嵌套的值。总结其所有价值的最佳和最佳方法是什么?

我尝试这样做:

hash.values.inject(0){|m,n| m + n.values.map(&:to_i).sum}

4 个答案:

答案 0 :(得分:2)

求解任意深度与求解固定深度没有太大差别:直接应用递归。如果当前值是一个哈希值,那么将它加总并将其加到总数中,如果没有添加值本身。

def hash_sum(h)
  h.values.inject(0) do |total, value|
    case value
    when Hash then total + hash_sum(value)
    else
      total + value.to_i
    end
  end
end

答案 1 :(得分:1)

从评论和示例中,我假设所有相关值都在深度2处。

hash = {"0"=>{"0"=>"148", "1"=>"2", "2"=>"90"}, "1"=>{"0"=>10}}
hash.values.flat_map(&:values).map(&:to_i).inject(:+)
# => 250

如果您拥有深度为3的所有值,则添加另一个flat_map(&:values)

hash = {"3" => {"0"=>{"0"=>"148", "1"=>"2", "2"=>"90"}, "1"=>{"0"=>10}}, "4" => {"0"=> {"1" => "6"}}}
hash.values.flat_map(&:values).flat_map(&:values).map(&:to_i).inject(:+)
# => 256

答案 2 :(得分:0)

最多两级嵌套(从您的解决方案派生):

hash = {"0"=>{"0"=>"148", "1"=>"2", "2"=>"90"}, "1"=>{"0"=>10}}
hash.values.inject(0) { |m, n| 
  Hash === n ? m + n.values.map(&:to_i).reduce(&:+) : m + n.to_i 
}
#⇒ 250

无限嵌套解决方案:

def sum_deeply(h)
  h.values.inject(0) { |m, v| 
    m + (Hash === v ? sum_deeply(v) : v.to_i) 
  } 
end
sum_deeply(hash)
#⇒ 250

希望它有所帮助。

答案 3 :(得分:0)

这是一种递归方法,它是弗雷德里克的一种变体:

def deep_hash(obj)
  return obj.to_i unless obj.is_a? Hash
  obj.reduce(0) { |t,(_,v)| t + deep_hash(v) }
end

hash = { "0"=>{ "0"=>"148, "1"=>"2", "2"=>"90" },
         "1"=>{ "0"=>10, "1"=>{ "0"=>16 } } }

deep_hash(hash)
  #=> 266