2013-12-14 125 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}