我有一个数组,其中包含这样的项目列表
arr = [ {:id=>1,:title=>"A",:parent_id=>nil},{:id=>2,:title=>"B",{:id=>3,:title=>"A1",:parent_id=>1},{:id=>4,:title=>"A2",{:id=>5,:title=>"A11",:parent_id=>3},{:id=>6,:title=>"12",{:id=>7,:title=>"A2=121",:parent_id=>6},{:id=>8,:title=>"A21",:parent_id=>4},{:id=>9,:title=>"B11",:parent_id=>2},{:id=>10,:title=>"B12",... ]
如果parent_id为nil,那么它应该是父节点,如果parent_id不是nil,则它应该在特定父节点下.
基于id和parent_id,我想提供这样的响应:
-A -A1 -A11 -A12 -A123 -A2 -A21 -B -B1 -B11 -B12
我怎么能产生上面提到的回应?
谢谢
解决方法
一个例子:
#!/usr/bin/env ruby root = {:id => 0,:title => '',:parent_id => nil} arr = arr = [ {:id=>1,] map = {} arr.each do |e| map[e[:id]] = e end @@tree = {} arr.each do |e| pid = e[:parent_id] if pid == nil || !map.has_key?(pid) (@@tree[root] ||= []) << e else (@@tree[map[pid]] ||= []) << e end end def print_tree(item,level) items = @@tree[item] unless items == nil indent = level > 0 ? sprintf("%#{level * 2}s"," ") : "" items.each do |e| puts "#{indent}-#{e[:title]}" print_tree(e,level + 1) end end end print_tree(root,0)
输出:
-A -A1 -A11 -12 -A2=121 -A2 -A21 -B -B11 -B12