2016-08-24 81 views
3

假設我們有什麼是一些很好的方法來反轉嵌套散列?

b = {"b"=>"c"} 

這樣做b.invert,我們可以很容易地獲得

{"c"=>"b"} 

那結果時,我想到了嘗試一些很酷。假設我們有

a = {"a"=>{"b"=>"c"}} 

請告訴我一個非常有效的方式,使這個{{"c"=>"b"}=>"a"}(在這裏我們扭轉最內hash攜手我們的出路)

當然,這將是最好將其擴展到n量在彼此之間散列。我一直在尋找類似的其他問題,但沒有發現任何問題。

謝謝。

回答

5

這可以通過遞歸方法實現,以反轉散列鍵值(如果需要,還可以使用值)。例如:

hsh = {{"c"=>"b"}=>"a"} 
def recursive_invert(hsh) 
    hsh.each_with_object({}) do |(k, v), inverted_hsh| 
     if k.is_a? Hash 
      k = recursive_invert(k) 
     end 
     inverted_hsh[v] = k 
    end 
end 
recursive_invert(hsh) # {"a"=>{"b"=>"c"}} 
+0

非常漂亮。遞歸解決方案確實是我自己嘗試的。 +1。讓我們看看其他紅寶石主義者可以提出什麼:) –

+0

這不會按照OP中的要求在另一個方向上工作。 '{「a」=> {「b」=>「c」}}''轉換爲'{{「c」=>「b」} =>「a」}' – engineersmnky

+0

@engineersmnky如果散列值如上所述(和你的答案中實現的)一樣,也是倒置的。 – Matt

2

這是一個雙向工作的遞歸解決方案。

def deep_invert(h) 
    h.each_with_object({}) do |(k,v),obj| 
     k = deep_invert(k) if k.is_a?(Hash) 
     v = deep_invert(v) if v.is_a?(Hash) 
     obj[v] = k 
    end 
end 

實施例:

a = {"a"=>{"b"=>"c"}} 
deep_invert(a) 
#=> {{"c"=>"b"}=>"a"} 
deep_invert(deep_invert(a)) == a 
#=> true 
相關問題