2015-03-03 88 views
-1

我有2個散列像這樣:紅寶石散列比較值,並返回相同的結構

stored_hash = { 
    :name => "hash_1", 
    :version => "1.0", 
    :values => { 
    :value_1 => "some_value", 
    :value_2 => "some_other_value", 
    :value_3 => "a_new_value", 
    ... 
    :value_x => "some_x_value" 
    } 
} 

compare_hash = { 
    :name => "hash_2", 
    :version => "2.0", 
    :values => { 
    :different_1 => "some_value", 
    :different_2 => "some_other_value", 
    :different_3 => "a_new_value", 
    ... 
    :different_x => "some_x_value" 
    } 
} 

我找到了共同的價值觀在兩個散列這樣的:values鍵:

same_values = hash[:values].values & compared_hash[:values].values 

一旦我得到它,我想返回一個類似於'stored_hash'的新散列,但是它的:values包含了我之前找到的same_values。

例如,如果兩個哈希有"some_value""some_other_value""a_new_value",我的新的哈希應該是這樣的:

new_hash = { 
    :name => "hash_1", 
    :version => "1.0", 
    :values => { 
    :value_1 => "some_value", 
    :value_2 => "some_other_value", 
    :value_3 => "a_new_value" 
    } 
} 
+0

什麼是'hash'和'co mpared_hash'? – sawa 2015-03-03 01:26:24

+0

你的問題是什麼? – sawa 2015-03-03 01:27:52

回答

1

這應該爲你工作:

stored_hash = { 
    :name => "hash_1", 
    :version => "1.0", 
    :values => { 
    :value_1 => "some_value", 
    :value_2 => "some_other_value", 
    :value_3 => "a_new_value", 
    :value_x => "some_a_value" 
    } 
} 

compare_hash = { 
    :name => "hash_2", 
    :version => "2.0", 
    :values => { 
    :different_1 => "some_value", 
    :different_2 => "some_other_value", 
    :different_3 => "a_new_value", 
    :different_x => "some_b_value" 
    } 
} 

common_values = compare_hash[:values].values & stored_hash[:values].values 
new_hash = stored_hash.dup 
new_hash[:values] = {} 
common_values.each_with_index do |value, index | 
    new_hash[:values]["value_#{index+1}".to_sym] = value 
end 
new_hash 
# => new_hash = { 
#  :name => "hash_1", 
#  :version => "1.0", 
#  :values => { 
#  :value_1 => "some_value", 
#  :value_2 => "some_other_value", 
#  :value_3 => "a_new_value" 
#  } 
# } 
1

這是一種方式,你可以獲得你想要的結果。

代碼

require 'set' 

def make_new_hash(stored_hash, compare_hash) 
    new_hash = stored_hash.dup 
    compare_values = 
    (stored_hash[:values].values & compare_hash[:values].values).to_set 
    values_hash = new_hash[:values] 
    keys_to_keep = values_hash.keys.select { |k| 
    compare_values.include?(values_hash[k])} 
    new_hash[:values] = 
    Hash[keys_to_keep.zip(values_hash.values_at(*keys_to_keep))] 
    new_hash 
end 

stored_hash = { 
    :name => "hash_1", 
    :version => "1.0", 
    :values => { 
    :value_1 => "some_value", 
    :value_2 => "some_other_value", 
    :value_3 => "a_new_value", 
    :value_x => "some_x_value" 
    } 
} 

compare_hash = { 
    :name => "hash_2", 
    :version => "2.0", 
    :values => { 
    :different_1 => "some_value", 
    :different_2 => "a_new_value", 
    :different_3 => "some_strange_value", 
    :different_x => "some_x_value" 
    } 
} 

請注意,我從在給定的問題做了一個小變化stored_hash

make_new_hash(stored_hash, compare_hash) 
    #=> {:name=>"hash_1", :version=>"1.0", 
    # :values=>{:value_1=>"some_value", :value_3=>"a_new_value", 
    # :value_x=>"some_x_value"}} 

說明

創建的stored_hash副本:

new_hash = stored_hash.dup 
    #=> {:name=>"hash_1", :version=>"1.0", 
    # :values=>{:value_1=>"some_value", 
    #    :value_2=>"some_other_value", 
    #    :value_3=>"a_new_value", 
    #    :value_x=>"some_x_value"}} 

我們只希望保留的new_hash[:values]如果new_hash[:values][k]是在值兩散的一個關鍵kstored_hash[:values]和散列compare_hash[:values],所以我們獲得這些值:

compare_values = 
    (stored_hash[:values].values & compare_hash[:values].values).to_set 
    # => #<Set: {"some_value", "a_new_value", "some_x_value"}> 

我選擇將它們保存在一個集合中,以加快查找速度並獲得唯一值。他們也可以像這樣保存到陣列中:

(stored_hash[:values].values & compare_hash[:values].values).uniq 
    #=> ["some_value", "a_new_value", "some_x_value"] 

如果使用數組而不是集合,則下面的代碼是相同的。

要simpify,讓我們創建一個變量:

values_hash = new_hash[:values] 
    #=> {:value_1=>"some_value", :value_2=>"some_other_value", 
    # :value_3=>"a_new_value", :value_x=>"some_x_value"} 

下一個確定的New_hash[:values]我們希望保持鍵:

keys_to_keep = values_hash.keys.select { |k| 
    compare_values.include?(values_hash[k])} 
    #=> [:value_1, :value_3, :value_x] 

所有按鍵以外:value_2保持。由於comparative_hash[:values]沒有值"some_other_value",所以不保留該密鑰。

現在,我們可以構建的new_hash[:values]更新值:

new_hash[:values] = 
    Hash[keys_to_keep.zip(values_hash.values_at(*keys_to_keep))] 
    #=> {:value_1=>"some_value", :value_3=>"a_new_value", 
    # :value_x=>"some_x_value"} 

最後,我們回到new_hash

new_hash 
    #=> {:name=>"hash_1", :version=>"1.0", 
    # :values=>{:value_1=>"some_value", :value_3=>"a_new_value", 
    # :value_x=>"some_x_value"}} 

讓我們確認時new_hash[:values]值被改變stored_hash不會改變:

new_hash[:values][:value_1] = 'cat' 
new_hash 
    #=> {:name=>"hash_1", :version=>"1.0", 
    # :values=>{:value_1=>"cat", :value_3=>"a_new_value", 
    # :value_x=>"some_x_value"}} 
stored_hash 
    #=> {:name=>"hash_1", :version=>"1.0", 
    # :values=>{:value_1=>"some_value", :value_2=>"some_other_value", 
    # :value_3=>"a_new_value", :value_x=>"some_x_value"}}