2014-12-07 87 views
0
hash = { 
    "d" => { 
    "o" => { 
     "g" => { 
     "s" => {} 
     }, 
     "l" => { 
     "l" => {} 
     }, 
     "o" => { 
     "m" => {} 
     } 
    } 
    }, 
    "b" => { 
    "o"=>{ 
     "o"=>{ 
     "m"=>{} 
     } 
    } 
    } 
} 

trie.print(hash) 

內特里類有方法稱爲print打印trie取鑰匙:如何內哈希對象

def print(trie) 
    trie.each do |k,v| 
    @res.concat(k) 
    print(trie[k]) if trie[k].length > 0 
    unless trie[k].length > 0 
     @result << @res unless trie[k].length > 0 
     @res = "" 
     p @result 
    end 
    end 
end 

上述方法打印:

["dogs", "ll", "om", "boom"] 

但我要打印:

["dogs" , "doll", "doom" , "boom"] 

回答

0

我已將該函數更名爲compose以避免與Kernel#print發生衝突。原因是我從內部調用這個函數,它應該可以調用,而不必明確地指向一個對象。您使用的方法不會「重複使用」遍歷的前綴。執行此操作的最常見方法是使用遞歸併在參數中構建該前綴。

我有這個遞歸函數。遞歸是處理樹木的常用方法。它接受一個「subtrie」和它放在下面的前綴(默認爲空字符串,如果沒有給出)。遞歸基礎:如果我們得到一個空的子查詢,我們返回一個構建前綴的單元素數組。更高級別將返回從給定「子路徑」構建的前綴數組。

def compose(trie, prefix="") 
    trie.flat_map do |k, v| 
    new_prefix = prefix + k 
    results = compose(v, new_prefix) 
    results.empty? ? new_prefix : results 
    end 
end 

注意flat_map,否則(與map),它會輸出一個深度嵌套結構數組與葉內置了前綴更換您的線索。

UPD:新版本返回空子數組的空數組。

+0

謝謝,它按照通緝的方式工作。做了小改動。 res = compose(v,前綴+ k) @ result << res除非trie [k] .length!= 0 – 2014-12-07 14:26:54

+0

@HariKrishnan不是這個函數已經用'empty?'來做這個了嗎 – 2014-12-07 14:34:08

+0

不,空字符串也包含在結果。 @ D方,然後我做了這個以避免空。 – 2014-12-07 14:56:32

2

我認爲我們不必傳遞前綴。

def compose(trie) 
    trie.flat_map do |k, v| 
    v.empty? ? k : compose(v).map{|sv| "#{k}#{sv}"} 
    end  
end 
+0

...而是將其附加到就地的結果中。很好,是的。除了不需要內部'flat_map'外,'map'就足夠了。 – 2014-12-07 16:16:55

+0

謝謝,@D方。 – nickcen 2014-12-08 15:14:59

+0

謝謝,@nickcen – 2014-12-09 04:30:38