来自多个哈希的Ruby和一个查找哈希值

时间:2015-06-15 20:31:10

标签: ruby indexing hash sum

我在3个单独的哈希中有以下数据:

produce = {100=>"apples",200=>"oranges",300=>"pears"}
north = {100=>10,200=>7,300=>11}
south = {100=>5,200=>19,300=>0}

我需要为所有区域的所有产品项目清点计数:

{"apples"=>15,"oranges"=>26,"pears"=>11} 

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这有两种方法。

<强>#1

produce.each_with_object({}) do |(k,v),h|
  h[v] = north[k].to_i + south[k].to_i
end
  #=> {"apples"=>15, "oranges"=>26, "pears"=>11} 

<强>#2

h = produce.invert
  #=> {"apples"=>100, "oranges"=>200, "pears"=>300} 
h.keys.each { |k| h[k] = north[h[k]].to_i + south[h[k]].to_i }
h
  #=> {"apples"=>15, "oranges"=>26, "pears"=>11} 

如果to_inorth没有密钥south,我h[k]附加了nil.to_i #=> 0

请注意,produce的值必须是唯一的,才能获得所需的结果。

答案 1 :(得分:1)

这个怎么样:

Hash[north.merge(south){ |_, a, b| a + b}.map{ |k,v| [produce[k], v]}]

Hash#merge合并了两个哈希值。

如果两个哈希具有相同的密钥并且我们传递一个块时发生冲突,则使用密钥,来自一个哈希的值,来自另一个哈希的值来调用该块,并将结果存储为值。因此

north.merge(south) {|_, a, b| a + b}

总结部分:

north.merge(south) {|_, a, b| a + b}
#=> {100=>15, 200=>26, 300=>11}

接下来,我们使用map转换sum hash的键:

north.merge(south) {|_, a, b| a + b}.map{ |k,v| [produce[k], v]}
#=> [["apples", 15], ["oranges", 26], ["pears", 11]]

由于这会产生一个数组,我们使用Hash.[]将其转换回哈希:

Hash[north.merge(south){ |_, a, b| a + b}.map{ |k,v| [produce[k], v]}]
=> {"apples"=>15, "oranges"=>26, "pears"=>11}