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}
答案 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 }