2013-11-01 83 views
-1

我需要建立此樹建立了一棵樹:從這些對象從相關對象

result = [ 
    ['t9'], 
    ['t3', 
    ['t4'], 
    ['t8', 
     ['t6'], 
     ['t1', 
     ['t5'] 
     ] 
    ] 
    ], 
    ['t7', 
    ['t2'] 
    ] 
] 

{:id => 't1', :tg => 't8', :rank => 2} 
{:id => 't2', :tg => 't7', :rank => 1} 
{:id => 't3', :tg => nil, :rank => 2} 
{:id => 't4', :tg => 't3', :rank => 1} 
{:id => 't5', :tg => 't1', :rank => 1} 
{:id => 't6', :tg => 't8', :rank => 1} 
{:id => 't7', :tg => nil, :rank => 3} 
{:id => 't8', :tg => 't3', :rank => 2} 
{:id => 't9', :tg => nil, :rank => 1} 

tg是自我指涉的關聯。 rank是陣列中的位置/索引

任何想法(首選紅寶石)?

+1

你能更好地表達自己嗎? 'result'看起來不像多維數組... –

+0

你聲稱的「th [e] s [e] objects」不是Ruby對象。什麼是't1','t2'等?您如何期望來自對象的信息被傳遞給一個方法? – sawa

+0

@sawa我簡化了你的對象列表。 –

回答

3
def combine e, a 
    a 
    .inject([]){|a, h| a[h[:rank] - 1] = [h[:id]] if h[:tg] == e; a} 
    .map{|e| e + combine(e.first, a)} 
end 

combine(nil, [ 
    {:id => 't1', :tg => 't8', :rank => 2}, 
    {:id => 't2', :tg => 't7', :rank => 1}, 
    {:id => 't3', :tg => nil, :rank => 2}, 
    {:id => 't4', :tg => 't3', :rank => 1}, 
    {:id => 't5', :tg => 't1', :rank => 1}, 
    {:id => 't6', :tg => 't8', :rank => 1}, 
    {:id => 't7', :tg => nil, :rank => 3}, 
    {:id => 't8', :tg => 't3', :rank => 2}, 
    {:id => 't9', :tg => nil, :rank => 1}, 
]) 
# => [["t9"], ["t3", ["t4"], ["t8", ["t6"], ["t1", ["t5"]]]], ["t7", ["t2"]]] 
+2

這是他最好的sawa。你明白了,恭喜! @AlexLopez:不要忘記接受選擇的答案! –

0

聽起來像你正在建立像樹一樣。該算法可以總結如下:

  1. 找到所有節點,其中:TG是零,那麼你得到[T3,T7,T9]
  2. 查找其所有節點:TG的[T3,T7內, T9],然後回來[T4,T8]
  3. 查找其所有節點:TG內[T4,T8] ...
0

使用遞歸(根據@ cenyongh的樹的概念)

def tree(arr,parent=nil) 
    arr.select{|n| n[:tg] == parent}. 
      sort_by{|n| n[:rank]}. 
      map{|n| [n[:id]] + tree(arr,n[:id])} 
end 

# call 
tree(array_of_objects)