0

文字列の配列を使用して、ルート、子、および孫ノードを持つツリーを構築しようとしています。私はこのような配列を持っています

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/"

孫ノードです。2 つの間にテキストがある文字列/はルート ノード、3 つある文字列/は子ノード、4 つある文字列/は孫ノードです。

ルートノードとしてコンデンサーがあったと想像してください。root_node = "capacitor" child_node = "/capacitor/non_polarized/","/capacitor/polarized/" and grandchild_node = "/capacitor/non_polarized/ceramic/", "/capacitor/polarized/al/"

編集:ルートノードを使用して子と孫を特定できるように出力したいと思います。

4

3 に答える 3

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)
于 2013-07-05T12:36:36.390 に答える