2013-12-14 164 views
2

我有兩個hashes-紅寶石:比較兩個哈希

hash1 = {a: "2", b: "34", c: "53", d: "23", e: "2"} 
hash2 = {a: "5", c: "8", d: "3", e: "2", f: "76"} 

我需要比較哈希並獲得下一步 -

hash1_1 = {a: "2", c: "53", d: "23", e: "2"} 
hash2_1 = {a: "5", c: "8", d: "3", e: "2"} 

也就是說,我需要比較兩個哈希,讓他們只有那些價值其鍵是相等的,並且有兩個哈希。

+0

你已經試過嗎? –

+0

你的問題是什麼? – sawa

+0

丹尼斯,謝謝你的機智。只是我正在尋找這個最好的解決方案.. –

回答

4

我會做如下:

hash1 = {a: "2", b: "34", c: "53", d: "23", e: "2"} 
hash2 = {a: "5", c: "8", d: "3", e: "2", f: "76"} 

hash1_1 = hash1.select{|k,_| hash2.has_key? k} 
# => {:a=>"2", :c=>"53", :d=>"23", :e=>"2"} 
hash1_2 = hash2.select{|k,_| hash1.has_key? k} 
# => {:a=>"5", :c=>"8", :d=>"3", :e=>"2"} 
+1

感謝奧雅納,這個神奇的解決方案=) –

1

操作步驟如下:

hash1 = {a: "2", b: "34", c: "53", d: "23", e: "2"} 
hash2 = {a: "5", c: "8", d: "3", e: "2", f: "76"} 

keys = (hash1.keys & hash2.keys) 
hash1_1 = hash1.select {| k,_ | keys.include? k } 
# => {:a=>"2", :c=>"53", :d=>"23", :e=>"2"} 
hash2_1 = hash2.select {| k,_ | keys.include? k } 
# => {:a=>"5", :c=>"8", :d=>"3", :e=>"2"} 
+0

包括輸出與您的代碼驗證... :) –

+0

其中的問題是? –

1

略有不同的方法

hash1 = {a: "2", b: "34", c: "53", d: "23", e: "2"} 
hash2 = {a: "5", c: "8", d: "3", e: "2", f: "76"} 

diff1 = (hash1.keys - hash2.keys) 
# => [:b] 
diff2 = (hash2.keys - hash1.keys) 
# => [:f] 

hash1_1 = hash1.dup 
diff1.each{|k| hash1_1.delete(k)} 
hash1_1 
# => {:a=>"2", :c=>"53", :d=>"23", :e=>"2"} 

hash2_1 = hash2.dup 
diff2.each{|k| hash2_1.delete(k)} 
hash2_1 
# => {:a=>"5", :c=>"8", :d=>"3", :e=>"2"} 

如果不需要原來的HASH1和HASH2,您可以跳過dup並直接從hash1和hash2中刪除。

3

您可以使用交集鍵,和Hash#select

first = {a: 1, c: 2, e: 3, g: 4} 
second = {a: 2, b: 3, c: 4, g: 5} 

intersection = first.keys & second.keys # => [:a, :c, :g] 

[first, second].map! { |h| h.select { |k, _| intersection.include? k } } 

first # => {:a=>1, :c=>2, :e=>3, :g=>4} 
second # => {:a=>2, :b=>3, :c=>4, :g=>5}