2016-03-15 24 views
0

我需要的是改變了如何比較2個散列和findout多少嵌套的哈希值已經改變了從一個哈希比較到另一個

hash1 = {"0"=>{"value"=>"value", "id"=>"1"}, "1"=>{"value"=>"value1", "id"=>"2"}, "2"=>{"value"=>"", "id"=>"3"}} 

hash2 = {"0"=>{"value"=>"value", "id"=>"1"}, "1"=>{"value"=>"random", "id"=>"2"}, "2"=>{"value"=>"seven", "id"=>"3"}} 

價值的關鍵value將嵌套哈希的數量只有這個變化。從比較2個散列上面可以看到有一些已經改變

"1"=>{"value"=>"value1", "id"=>"2"}, 

"1"=>{"value"=>"random", "id"=>"2"} 

"2"=>{"value"=>"", "id"=>"3"} 

"2"=>{"value"=>"seven", "id"=>"3"} 

我嵌套的散列不知道如何比較2個哈希這和findout出兩個

回答

1

我認爲你可以做hash1.to_a - hash2.to_a獲得差異

+0

想你的解決方案,它的工作原理。要找出嵌套散列的數量,我們將在結果中加上'.length':'(hash1.to_a - hash2.to_a).length' –

0

編輯之間改變嵌套哈希數量:我知道我錯過了「,在鍵值的值將是唯一的變化的東西。「我的答案允許更改"value"以外的其他密鑰的值。如果OP或任何讀者也對這個問題感興趣,我會留下我的回答。

這裏有三種方法可以做到這一點。

步驟通過任一散列和計數差異

hash1.reduce(0) { |count,(k,v)| count + ((hash2[k]["value"]==v["value"]) ? 0 : 1) } 
    #=> 2 

使用Hash#merge

這種方法使用了採用塊以確定該值哈希#合併的形式時的一個關鍵是本在這兩個哈希正在合併。我實際上並沒有使用該塊來達到預期的目的,但是當兩個值相等時,我只是遞增count

count = 0 
hash1.merge(hash2) { |_,v1,v2| count += 1 unless v1["value"] == v2["value"] } 
count 
    #=> 2 

獲取密鑰,拉值進行壓縮,總結差異的數字

keys = hash1.keys 
    #=> ["0", "1", "2"] 
hash1.values_at(*keys).zip(hash2.values_at(*keys)).reduce(0) { |count,(v1,v2)| 
    count + ((v1["value"] == v2["value"]) ? 0 : 1) } 
    #=> 2 

這些方法都需要鑰匙在兩個哈希值進行排序相同。

0

在簡單的解決方案中,我建議您迭代每個鍵並比較兩個散列值的嵌套散列。 至於你說的那兩個哈希的鍵是,這個解決方案應該是合適的:

count = 0  
hash1.keys.each do 
    count = count + 1 if hash1[key] != hash2[key] 
end 
# p count