Ruby中是否有方法将对象的所有属性值相加?
Ruby中实现哈希键值对应相加的高效方式
如果要实现两个哈希按相同键的值相加,用Hash#merge配合块是最直接的高效方案——内置方法是底层优化过的,比手动循环更省性能:
hash1 = {:a => 1, :b => 2} hash2 = {:a => 2, :b => 1} merged_hash = hash1.merge(hash2) { |key, val1, val2| val1 + val2 } # 结果: {:a=>3, :b=>3}
如果是处理数组中的多个哈希,用inject(或reduce)结合merge,只需要遍历数组一次,每次合并两个哈希:
hash_array = [{:a => 1, :b => 2}, {:a => 2, :b => 1}, {:a => 3, :b => 4}] total_hash = hash_array.inject({}) do |accumulator, current_hash| accumulator.merge(current_hash) { |k, v1, v2| v1 + v2 } end # 结果: {:a=>6, :b=>7}
如果所有哈希的键完全一致,还可以换一种思路:先提取键集合,再对每个键在所有哈希中求和,这种方式也只需要两次遍历(一次取键,一次遍历数组求和):
keys = hash_array.first.keys total_hash = keys.each_with_object({}) do |key, acc| acc[key] = hash_array.sum { |h| h[key] || 0 } # 加||0处理缺失键的情况 end
不用纠结“多次迭代”的问题,Ruby内置方法的迭代是C层级实现的,比自己写Ruby循环的性能高很多,实际运行效率会比手动遍历每个键好不少。
内容的提问来源于stack exchange,提问作者Nate McGraw
相关产品推荐
相关产品推荐

