Ruby中仅合并两个哈希共有键并对值运算的实现问题
Ruby 哈希合并:仅保留共有键并对值运算
需求:仅合并两个哈希中同时存在的键,对对应值执行相加或相乘操作。
示例哈希:
hash1 = {"a" => 1, "b" => 2, "c" => 3 } hash2 = {"a" => 1, "b" => 2, "c" => 3, "d" => 4, "e" => 5}
期望结果(相加操作):
{"a" => 2, "b" => 4, "c" => 6 }
当前问题:使用 hash1.merge(hash2) { |key1, value1, value2| value1 + value2 } 时,虽能正确相加共有键的值,但会保留非共有键d和e,不符合需求。
解决方法
方法1:先取键的交集,再构建结果哈希
先获取两个哈希的共有键集合,再遍历这些键对值进行运算,最终生成目标哈希:
相加操作
common_keys = hash1.keys & hash2.keys result = common_keys.each_with_object({}) do |key, new_hash| new_hash[key] = hash1[key] + hash2[key] end # 输出:{"a"=>2, "b"=>4, "c"=>6}
相乘操作
只需将运算逻辑替换为乘法即可:
common_keys = hash1.keys & hash2.keys result = common_keys.each_with_object({}) do |key, new_hash| new_hash[key] = hash1[key] * hash2[key] end # 输出:{"a"=>1, "b"=>4, "c"=>9}
方法2:合并后筛选共有键
先执行merge完成值的运算,再通过select筛选出仅在两个哈希中都存在的键:
相加操作
result = hash1.merge(hash2) { |k, v1, v2| v1 + v2 }.select { |k| hash1.key?(k) && hash2.key?(k) } # 输出:{"a"=>2, "b"=>4, "c"=>6}
这种方式代码更简洁,适合哈希数据量较小的场景;若哈希规模较大,方法1的性能会更优,因为避免了对非共有键的无效运算。
内容的提问来源于stack exchange,提问作者Hind20
相关产品推荐
相关产品推荐

