首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用字符串数组的树节点

使用字符串数组的树节点
EN

Stack Overflow用户
提问于 2013-07-05 09:29:15
回答 3查看 274关注 0票数 0

我正在尝试使用字符串数组构建具有根节点、子节点和孙子节点的树。我有这样一个数组

代码语言:javascript
复制
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/"
]

我想使用这个数组并确定相应的节点。那些就像

代码语言:javascript
复制
"/capacitor/", "/connector/", "/diode/"

是根节点。那些就像

代码语言:javascript
复制
"/capacitor/non_polarized/", "/capacitor/polarized/", "/optical/detector/"

是子节点,最后是类似的

代码语言:javascript
复制
"/optical/detector/diode/", "/optical/emmision/laser/"

是孙辈的节点。中间有两个/和text的字符串是根节点,三个/是子节点,四个/是孙辈节点。

想象一下我有电容作为我的根节点,现在我有了root_node = "capacitor" child_node = "/capacitor/non_polarized/","/capacitor/polarized/" and grandchild_node = "/capacitor/non_polarized/ceramic/", "/capacitor/polarized/al/"

编辑:,我希望以这样的方式输出,通过使用根节点,我可以确定子代和孙辈。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-05 09:56:03

我相信有更好的方法来做这件事,但是如果这能帮助你的话

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-07-05 10:28:11

代码语言:javascript
复制
roots, children, grandchildren =
array.group_by{|s| s.count("/")}.values_at(2, 3, 4)
票数 1
EN

Stack Overflow用户

发布于 2013-07-05 12:36:36

我会这样做:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17485543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档