在哈希中添加数组的值

时间:2015-02-05 09:38:10

标签: ruby arrays hash

我创建了一个将数组作为值的哈希。

{
  "0":[0,14,0,14],
  "1":[0,14],
  "2":[0,11,0,12],
  "3":[0,11,0,12],
  "4":[0,10,0,13,0,11],
  "5":[0,10,0,14,0,0,0,11,12,0],
  "6":[0,0,12],
  "7":[],
  "8":[0,14,0,12],
  "9":[0,14,0,0,11,14],
  "10":[0,11,0,12],
  "11":[0,13,0,14]
}

我想要每个数组中所有值的总和。我希望有这样的输出:

{
  "0":[24],
  "1":[14],
  "2":[23],
  "3":[23],
  "4":[34],
  "5":[47],
  "6":[12],
  "7":[],
  "8":[26],
  "9":[39],
  "10":[23],
  "11":[27]
}

我不知道如何从这里开始。任何指针都很感激。

4 个答案:

答案 0 :(得分:3)

我会做这样的事情:

hash = { "0" => [0,14,0,14], "1" => [0,14], "7" => [] }

hash.each { |k, v| hash[k] = Array(v.reduce(:+)) }
# => { "0" => [28], "1" => [14], "7" => [] }

答案 1 :(得分:0)

对于hash对象,你就是这个。

hash = {"0"=>[0,14,0,14],"1"=>[0,14],"2"=>[0,11,0,12],"3"=>[0,11,0,12],"4"=>[0,10,0,13,0,11],"5"=>[0,10,0,14,0,0,0,11,12,0],"6"=>[0,0,12],"7"=>[],"8"=>[0,14,0,12],"9"=>[0,14,0,0,11,14],"10"=>[0,11,0,12],"11"=>[0,13,0,14]}

您可以更改每个k => v

的值
hash.each_pair do |k, v|
  hash[k] = [v.reduce(0, :+)]
end

将解决

hash = {"0"=>[28], "1"=>[14], "2"=>[23], "3"=>[23], "4"=>[34], "5"=>[47], "6"=>[12], "7"=>[0], "8"=>[26], "9"=>[39], "10"=>[23], "11"=>[27]} 

答案 2 :(得分:0)

map / reduce的经典示例。您需要迭代哈希键和值(map {|k,v|}),并使用reduce(0) {|acc, x| acc+x}

为每个值计算总和
h = {1 => [1,2,3], 2 => [3,4,5], 7 => []} #example
a = h.map {|k,v| [k ,v.reduce(0) {|acc, x| acc+x}] }
=> [[1, 6], [2, 12], [7, 0]]
Hash[a]
=> {1=>6, 2=>12, 7=>0}

答案 3 :(得分:0)

如果您的字符串与您提到的一样,您可以使用JSON解析它,或者如果您已经有Hash则跳过该步骤。 您可以查看注入here

的文档
require 'json'
json_string =  '
{
  "0":[0,14,0,14],
  "1":[0,14],
  "2":[0,11,0,12],
  "3":[0,11,0,12],
  "4":[0,10,0,13,0,11],
  "5":[0,10,0,14,0,0,0,11,12,0],
  "6":[0,0,12],
  "7":[],
  "8":[0,14,0,12],
  "9":[0,14,0,0,11,14],
  "10":[0,11,0,12],
  "11":[0,13,0,14]
}
'
hash = JSON.parse json_string

result = Hash.new

hash.each do |key, value|

  result[key] = value.inject(:+)

end

puts result.inspect

结果:

{"0"=>28, "1"=>14, "2"=>23, "3"=>23, "4"=>34, "5"=>47, "6"=>12, "7"=>nil, "8"=>26, "9"=>39, "10"=>23, "11"=>27}