Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用查找哈希从多个哈希求和_Ruby_Indexing_Hash_Sum - Fatal编程技术网

Ruby 使用查找哈希从多个哈希求和

Ruby 使用查找哈希从多个哈希求和,ruby,indexing,hash,sum,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} 有什么想法吗?这

我有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} 

有什么想法吗?

这里有两种方法

#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} 
如果
north
south
没有键
h[k]
,我将
附加到I
,作为
nil.to#I=>0

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

如何:

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
转换求和散列的键:

north.merge(south) {|_, a, b| a + b}.map{ |k,v| [produce[k], v]}
#=> [["apples", 15], ["oranges", 26], ["pears", 11]]
由于这会产生一个数组,我们使用
散列。[]
将其转换回散列:

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

欢迎来到堆栈溢出。不要要求我们向您提供代码,您应该向我们展示您的尝试,我们将帮助您修复。对于Ruby v2+,您可以使用
来_h
而不是将代码包装在
散列[…]
中。