2015-01-15 50 views
-1
hash_list = { 
"a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"}, 
"b"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"}, 
"c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"}, 
"d"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"} 
} 

我期待的結果如下,刪除重複項中的散列的不同哈希散列值

{ 
"c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"}, 
"d"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"} 
} 

我怎樣才能得到上面的結果呢?如果我做

hash_list.invert.invert 

然後,我得到

{ 
    "b"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"}, 
    "c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"}, 
    "d"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"} 
} 

在上面的結果,實際上沒有必要"b"。我需要用id來維護這個值。

+0

重複http://stackoverflow.com/questions/27916171的。 – sawa

+0

問題不清楚。 – sawa

+0

我認爲這個問題比較清楚,他對於應該發生什麼,例如輸入,預期輸出,他所嘗試的以及他的嘗試結果有什麼問題有一個大致的描述。我編輯了它,試圖讓它更清晰一些。 –

回答

3

我定義散列gg由散列h當且僅當g[k] == h[k]主導所有密鑰(即,用於在所有g.keysk)。此外,如果存在另一個鍵值對kk=>hh,則我將hash_list中的鍵值對k=>h定義爲佔優勢,使得散列h由散列hh支配。

我假定要返回的散列只包含hash_list中的非主導鍵值對。有了這樣的定義:

  • a被刪除,因爲它是由b(和d)和
  • b爲主,因爲它是由d支配被刪除。

代碼

def remove_dominated_values(hash) 
    hl = hash.dup 
    keys = hl.keys 
    key = keys.shift 
    while keys.any? 
    h = hl[key] 
    hkeys, hvalues = hl[key].keys, hl[key].values 
    hl.delete(key) if keys.any? { |k| hvalues == hl[k].values_at(*hkeys) } 
    key = keys.shift 
    end 
    hl 
end 

hash_list = { 
    "a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"}, 
    "b"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"}, 
    "c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"}, 
    "d"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"} 
} 

remove_dominated_values(hash_list) 
    #=> {"c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"}, 
    # "d"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"}} 
+1

我喜歡這個答案和完整的解釋。 – BMW