首页 > 解决方案 > 在 ruby​​ 中实现合并方法

问题描述

我正在尝试在我的代码中实现合并方法。

A = { "a" => 200, "b" => 100 }
B = { "b" => 100, "c" => 300 }

所以当我调用A.merge_method(B)我的主函数时,它应该返回

A.merge_method(B) #=> {"a"=>200, "b"=>200, "c"=>300}

不使用合并方法如何实现?

标签: rubymergehashmaparray-merge

解决方案


这是一般的想法:收集要合并的任何散列的所有键,然后对于每个键,收集具有该键的所有散列中的值,并对它们求和。

module HashWithMergeReduce
  refine Hash do
    def merge_reduce(*others, &op)
      hashes = [self, *others]
      hash_keys = hashes.map(&:keys).inject(Set.new, &:+)
      hash_keys.each do |key|
        hashes_with_key = hashes.select { |hash| hash.has_key?(key) }
        self[key] = hashes_with_key.map { |hash| hash[key] }.reduce(&op)
      end
      self
    end
  end
end

module TestHashWithMergeReduce
  using HashWithMergeReduce
  a = { "a" => 200, "b" => 100 }
  b = { "b" => 100, "c" => 300 }  
  puts a.merge_reduce(b, &:+)
  # => {"a"=>200, "b"=>200, "c"=>300}
end

推荐阅读