我正在尝试使用字符串数组构建一个包含根,子节点和孙子节点的树。我有一个像这样的数组
array = [
"/capacitor/",
"/capacitor/non_polarized/",
"/capacitor/non_polarized/ceramic/",
"/capacitor/polarized/",
"/capacitor/polarized/al/",
"/connector/",
"/diode/",
"/diode/normal/",
"/optical/",
"/optical/emmision/diode/",
"/optical/emmision/laser/",
"/optical/detector/",
"/optical/detector/diode/"
]
我想获取此数组并确定各自的节点。那些就像
"/capacitor/", "/connector/", "/diode/"
是根节点。那些就像
"/capacitor/non_polarized/", "/capacitor/polarized/", "/optical/detector/"
是子节点,最后是
"/optical/detector/diode/", "/optical/emmision/laser/"
是孙子节点。其中包含两个/
和文本的字符串是根节点,其中三个/
是子节点,四个/
是孙子节点。
想象一下,我有电容作为我的根节点,现在我有root_node = "capacitor" child_node = "/capacitor/non_polarized/","/capacitor/polarized/" and grandchild_node = "/capacitor/non_polarized/ceramic/", "/capacitor/polarized/al/"
编辑:我想以这样的方式输出,通过使用根节点我可以确定子孙。
答案 0 :(得分:1)
我确信有更好的方法可以做到这一点,但如果这可以帮到你
tree = array.inject({}) do |h, string|
values = string.split('/').reject(&:empty?)
top = values.shift
h[top] ||= {}
values.inject(h[top]) do |sub_h, value|
sub_h[value] ||= {}
end
h
end
y tree
#---
#capacitor:
# non_polarized:
# ceramic: {}
#
# polarized:
# al: {}
#
#connector: {}
#
#diode:
# normal: {}
#
#optical:
# emmision:
# diode: {}
#
# laser: {}
#
# detector:
# diode: {}
答案 1 :(得分:1)
roots, children, grandchildren =
array.group_by{|s| s.count("/")}.values_at(2, 3, 4)
答案 2 :(得分:0)
这就是我要做的事情:
class TreeNode
attr_accessor :name, :children
def initialize(name, children_strings)
@name = name
@children = []
@children << TreeNode.new(children_strings.shift, children_strings) if !children_strings.nil? and children_strings.count > 0
self
end
def to_hash
{ name => children.map(&:to_hash) }
end
def self.process_node(root, strings_array)
next_node = root.children.detect { |n| n.name == strings_array.first }
if !next_node.nil?
strings_array.shift
process_node(next_node, strings_array)
else
root.children << TreeNode.new(strings_array.shift, strings_array)
end
end
def self.process_array(array)
root = TreeNode.new('root', nil)
array.each do |string|
strings_array = string.split('/')
strings_array.shift
TreeNode.process_node(root, strings_array)
end
root
end
end
root = TreeNode.process_array(array)