在哈希中添加值

时间:2011-02-16 02:15:57

标签: ruby

array1 = { "d1" => 2, "d2" => 3}
array2 = { "d1" => 3, "d3" => 10}

我想要这个:
array3 = { "d1" => 5, "d2" => 3, "d3" => 10}

我试过这个,它不起作用。我收到错误:“NoMethodError:未定义的方法`+'代表nil:NilClass”

array3 = {}
array1.each {|key, count| array3[key] += count}
array2.each {|key, count| array3[key] += count}

4 个答案:

答案 0 :(得分:4)

您收到错误是因为array1.each尝试访问尚未存在的array3['d1'],因此它返回nil作为值。您只需要更具体地定义array3,使用Hash.new告诉它默认情况下将0分配给所有密钥。

array3 = Hash.new(0)
array1.each {|key, count| array3[key] += count}
array2.each {|key, count| array3[key] += count}

但是要小心前进:您可以修改作为默认值传递的对象,因此如果您要编写my_hash = Hash.new(Array.new); my_hash[:some_key] << 3,那么接收默认值的所有键将共享同一个对象。这是Ruby中的一个奇怪的问题,在这种情况下你想要使用Hash.new的块版本。

答案 1 :(得分:4)

它更简单

=> h1 = { "a" => 100, "b" => 200 }
{"a"=>100, "b"=>200}
=> h1 = { "a" => 100, "b" => 200 }
{"b"=>254, "c"=>300}
=> h1.merge(h2) {|key, oldval, newval| newval + oldval}
{"a"=>100, "b"=>454, "c"=>300}

它在core-1.8.7中没有记录,但你可以在这里阅读更多内容: http://www.ruby-doc.org/core/classes/Hash.src/M000759.html

它适用于两个版本

答案 2 :(得分:1)

用户必须初始化第二个数组中不存在的值的键:

irb(main):007:0> array1 = {"d1" => 2, "d2" => 3}
=> {"d1"=>2, "d2"=>3}
irb(main):008:0> array2 = {"d1" => 3, "d3" => 10}
=> {"d1"=>3, "d3"=>10}
irb(main):009:0> array3 = {}
=> {}
irb(main):010:0> array1.each {|key, count| array3[key] = (array3[key] || 0) + count}
=> {"d1"=>2, "d2"=>3}
irb(main):011:0> array2.each {|key, count| array3[key] = (array3[key] || 0) + count}
=> {"d1"=>3, "d3"=>10}
irb(main):012:0> array3
=> {"d1"=>5, "d2"=>3, "d3"=>10}
irb(main):013:0> 

答案 3 :(得分:0)

如果哈希中的所有都是不是整数,那么您可以使用此技巧,该技巧使用string.to_i给出零的事实

hash.to_a.flatten.inject{|sum, n| sum.to_s.to_i + n.to_s.to_i }