2012-11-30 47 views
27

我有兩個散列結合...如何一個哈希與另一個散列紅寶石

a = {:a => 5} 
b = {:b => 10} 

我想...

c = {:a => 5,:b => 10} 

如何創建哈希C嗎?

+0

剛剛纔在IRB – thefonso

+0

1.9.3p194時做這樣的事情

people = person1.merge(person2) {|key, old, new| old} Output: {"name"=>"MarkZuckerberg", "company_name"=>"Facebook", "job"=>"CEO", "position"=>"Chairman"} 

這僅僅是一個快速的注意{:A => 5} = > {:a => 5} 1.9.3p194:002> hash2 = {:b => 10} => {:b => 10} 1.9.3p194:003> hash3 = hash1.merge(hash2) => {:a => 5,:b => 10} 1.9.3p194:004> hash3 => {:a => 5,:b => 10} 1.9.3p194:005> – thefonso

回答

51

它,如果你只是交錯一個漂亮的直進操作:

c = a.merge(b) 

如果你想實際添加值在一起,這將是一個有點棘手,但也不是不可能:

c = a.dup 
b.each do |k, v| 
    c[k] ||= 0 
    c[k] += v 
end 

a.dup的原因是爲了避免損壞a哈希中的值,但是如果您不在意可以跳過該部分。 ||=用於確保它以缺省值0開頭,因爲nil + 1無效。

19

檢查出的文檔由於大家都在說,你可以使用合併的方法來解決你的問題。但是,使用合併方法存在一些問題。這是爲什麼。

person1 = {"name" => "MarkZuckerberg", "company_name" => "Facebook", "job" => "CEO"} 

person2 = {"name" => "BillGates", "company_name" => "Microsoft", "position" => "Chairman"} 

看看這兩個字段name和company_name。這裏name和company_name在兩個哈希值(我的意思是關鍵字)是相同的。下一份工作和職位有不同的關鍵。

當您嘗試合併兩個散列person1和person2如果person1和person2鍵相同?那麼person2鍵值將覆蓋peron1鍵值。這裏第二個散列會覆蓋第一個散列字段,因爲兩者都是相同的。這裏的名字和公司名稱是一樣的。查看結果。

people = person1.merge(person2) 

Output: {"name"=>"BillGates", "company_name"=>"Microsoft", 
     "job"=>"CEO", "position"=>"Chairman"} 

但是,如果你不想讓你的第二個散列覆蓋第一個散列。 001> HASH1 =:你可以使用合併()

+1

(更多)完整的合併功能sponse! :) +1 – Zackkenyon

+0

你是我今天的英雄。我一直在尋找這個。 –

+0

碰撞是重要的考慮!但是你的解決方案和'people = person2.merge(person1)'是一樣的,對嗎?在這種情況下,該塊不是必需的,但如果您想爲碰撞做更復雜的處理,則該塊非常有用。這對'merge!'(破壞性版本)也很有用。 –