2012-03-10 61 views
1

complement是我正在尋找的數學術語,但對於上下文和可能更有針對性的解決方案:我有散列A,它可以嵌套散列(即它們是N維),並且我向它應用了一個返回散列B的過程(在這個過程中,我無法控制),散列B是散列A,其中一些元素被刪除。從那裏開始,我試圖找到A中已經被刪除的元素。查找兩個哈希的(深)補碼

例如:(注意,爲了簡單起見,我使用了符號,鍵將始終是符號,但值不會。)

a = {:a => :b, 
    :c => {:d => :e, :f => :g}, 
    :h => :i, 
    :j => {:k => :l, :m => :n}, 
    :o => {:p => :q, :r => :s}, 
    :t => :u} 

b = {:h => :i, 
    :j => {:k => :l, :m => :n}, 
    :o => {:r => :s}, 
    :t => :u} 

complement(a,b) 
#=> {:a => :b, 
# :c => {:d => :e, :f => :g}, 
# :o => {:p => :q}} 

什麼是最好的(ruby-esque)這樣做的方式?

+0

深度是否隨意?數組中是否存在潛在的重複元素?你在乎*這些元素在哪裏?或者只是它們被刪除了? – 2012-03-10 02:26:04

+0

深度是任意的(這是用戶輸入),儘管它不應超過兩個或三個級別。至於重複,這是我們正在討論的哈希,所以鍵*不能*有重複;價值可以,當然。最後,我檢查了一下,哈希沒有排序。 – 2012-03-10 02:30:08

+0

哈希按廣告順序按1.9排序,但未在1.8中指定順序。 – 2012-03-10 02:34:29

回答

1

想出了這個

a = {a: "thing", b: [1,2,3], c:2} 
b = {a: "thing", b: [1,2,3]} 
c= {} 
a.each do |k, v| 
    c[k] = v unless b[k] 
end 
p c 

編輯:現在檢查嵌套的哈希值。但是,是的,應該有一些更好的紅寶石方式來做到這一點。

def check_deleted(a, b) 
    c = Hash.new 
    a.each do |k, v| 
     if ! b.has_key? k 
      c[k] = v 
     elsif b[k].is_a? Hash 
      c[k] = check_deleted(v, b[k]) 
     end 
    end 
    c 
end 
a = {a: "thing", b: [1,2,3], c:2, d: {e: 1, r:2}} 
b = {a: "thing", b: [1,2,3], d: {r:2}} 

p check_deleted(a,b) #=> {:c=>2, :d=>{:e=>1}} 
+0

是的,這隻適用於一維哈希。 – 2012-03-10 02:32:41

+0

哦,我忘了那個。 – 2012-03-10 02:36:28

+0

這有效......如果沒有人來,並且給出一個ruby-esque-er解決方案,我會接受它:) – 2012-03-10 03:04:11