2013-11-01 84 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)