2017-07-20 118 views
-1

我有2个哈希有键和值合并两个哈希

h1 = {"January"=>1, "February"=>2, "March"=>4, "April"=>5, "May"=>5, "June"=>6} 

h2 = {1=>3, 2=>5, 3=>10, 4=>12, 6=>14} 

而且我希望有一个像

result = {3=>1, 5=>2, 10=>4, 12=>5, 14=>6} 

如果你想1我试过这个解决方案

结果返回两个“第一”和“一”,你需要将它们存储在 一个数组那么这将是这1所映射到的值。

results = {} 

    hash1.each do |key, value| if results[key].nil? 
    results[key] = [value] else 
    results[key] << value 

hash2.each do |key, value| if results[key].nil? 
    results[key] = [value] else 
    results[key] << value 

results[1] 
# => ["one", "first"] 

但我的结果是

{1=>[3], 2=>[5], 3=>[10], 4=>[12], 6=>[14], "January"=>[1], "February"=>[2], "March"=>[4], "April"=>[5], "May"=>[5], "June"=>[6]} 
+0

好像最后一个键值在预期的结果应该是14-5对不对? –

+0

wako,最后我想出了一个解决方案,感谢@maxpleaner,你能否看到这是你在找什么? –

+0

感谢您的帮助,我在寻找与我的第一个散列和我的第二个散列值的结果散列不是像值月,透露更多的细节我第一次哈希值是每月和第二价格销售的数量每月 – Wako

回答

1

这是因为你在一个列表sorround它,尽量做的跟随着,并不需要做第二foreach循环:

Recomended way:

hash1 = {"January"=>1, "February"=>2, "March"=>4, "April"=>5, "May"=>5, "June"=>6} 

hash2 = {1=>3, 2=>5, 3=>10, 4=>12, 6=>14} 

results = {} 

#here you have to swap key-value for value-key 

hash2.each do |value, key| 
    if results[key].nil? 
    results[key] = value 
    else 
    results[key] << value 
    end 
end 

results 

=> {3 => 1,5 => 2,10 => 3,12 => 4,14 => 6}

替代方式:

可以压缩的两个列表,键中的一个,另一个的值,然后把它们在字典中:

hash1 = {"January"=>1, "February"=>2, "March"=>4, "April"=>5, "May"=>5, "June"=>6} 

hash2 = {1=>3, 2=>5, 3=>10, 4=>12, 6=>14} 

results = {} 

(hash2.values).zip(hash1.values).each do |key, value| 
    if results[key].nil? 
    results[key] = value 
    else 
    results[key] << value 
    end 
end 

results 

=> {3 => 1,5 => 2,10 => 4,12 => 5 ,14 => 5}

+1

看问题中的预期输出,这是不一样的 –