【问题标题】:Build a tree from related objects [closed]从相关对象构建树[关闭]
【发布时间】:2013-11-12 13:02:52
【问题描述】:

我需要建造这棵树:

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 是数组中的位置/索引

任何想法(在 ruby​​ 中首选)?

【问题讨论】:

  • 你能更好地表达自己吗? result 根本不像多维数组...
  • 您声称的“th[e]s[e] 对象”不是 Ruby 对象。 t1t2 等是什么?您希望如何将来自对象的信息传递给方法?
  • @sawa 我为你简化了对象列表。

标签: ruby arrays algorithm multidimensional-array


【解决方案1】:
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"]]]

【讨论】:

  • 这是最好的。你想通了,恭喜! @AlexLopez:别忘了接受选择的答案!
【解决方案2】:

听起来你正在建造类似树的东西。算法总结如下:

  1. 找到 :tg 为 nil 的所有节点,然后得到 [t3, t7, t9]
  2. 在[t3, t7, t9]内找到所有:tg的节点,然后返回[t4, t8]
  3. 在[t4, t8]内找到所有:tg的节点 ...

【讨论】:

    【解决方案3】:

    使用递归(基于@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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 2019-08-20
      • 2011-08-14
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      相关资源
      最近更新 更多