Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中构建独特树的最快/最短方法?_Ruby_Tree_Query Optimization - Fatal编程技术网

在Ruby中构建独特树的最快/最短方法?

在Ruby中构建独特树的最快/最短方法?,ruby,tree,query-optimization,Ruby,Tree,Query Optimization,如果树有一组已定义的节点(我们将使用此算法来计算,因此不必手动执行),那么从一棵树(其中许多元素在某些节点中重复/缺失)构建唯一元素树的最快/最短/一行线(不可能:p)方法是什么 它可以是XML/JSON(散列),或者其他任何形式。比如说: …转换为: 与xml相同: <root> <nodes> <nodeA/> <nodeB> <subNodeA/>

如果树有一组已定义的节点(我们将使用此算法来计算,因此不必手动执行),那么从一棵树(其中许多元素在某些节点中重复/缺失)构建唯一元素树的最快/最短/一行线(不可能:p)方法是什么

它可以是XML/JSON(散列),或者其他任何形式。比如说:

…转换为:

与xml相同:

<root>
    <nodes>
        <nodeA/>
        <nodeB>
            <subNodeA/>
        </nodeB>
    </nodes>
    <nodes>
        <nodeA>
            <subNodeA/>
        </nodeA>
        <nodeB>
            <subNodeX/>
        </nodeB>
    </nodes>
</root>





xml/json文件可能相当大(1MB+),因此必须首先迭代每个元素的深度,否则可能需要一段时间。它也可以像上面的示例一样小。

这将为您提供一组独特的路径:

require 'nokogiri'
require 'set'

xml = Nokogirl::XML.parse(your_data)
paths = Set.new
xml.traverse {|node| next if node.text?; paths << node.path.gsub(/\[\d+\]/,"").sub(/\/$/,"")}
需要“nokogiri”
需要“设置”
xml=Nokogirl::xml.parse(您的_数据)
路径=Set.new

xml.traverse{| node | next if node.text?;path这将获得一组唯一的路径:

require 'nokogiri'
require 'set'

xml = Nokogirl::XML.parse(your_data)
paths = Set.new
xml.traverse {|node| next if node.text?; paths << node.path.gsub(/\[\d+\]/,"").sub(/\/$/,"")}
需要“nokogiri”
需要“设置”
xml=Nokogirl::xml.parse(您的_数据)
路径=Set.new

xml.traverse{| node | next if node.text?;path我正在尝试找出所有唯一的路径是什么,所以即使只是将路径放入字符串数组也很完美,我可以从中创建一棵树。我认为你甚至不能用JSON表示该结构;你有两个键,名为“nodes”.lol,是的,我很快就写出来了。我想它可以归结为,我如何在树中找到所有唯一的值,也许是叶节点?我正在试图找出所有唯一的路径是什么,所以即使只是将路径放入字符串数组也很完美,我可以从中创建一棵树。我认为你甚至不能表示这个结构JSON为true;您有两个名为“nodes”的键.lol,没错,我只是很快写了出来。我想它可以归结为,我如何在树中找到所有唯一的值,可能是叶节点?回答得好,我喜欢集合。使用得不够。不行,硬frickin core。就是这样,我不敢相信,一行!非常感谢glenn。你会如何添加到它中,以包含所有属性的唯一路径:)/root/nodes/nodeA//@customAttribute。回答得好,我喜欢Set。使用得不够。不行,硬frickin core。就是这样,我不敢相信,一句话!非常感谢glenn。你会如何添加到它以包括所有属性的唯一路径:)?/root/nodes/nodeA/@customAttribute。

<root>
    <nodes>
        <nodeA>
            <subNodeA/>
        </nodeA>
        <nodeB>
            <subNodeA/>
            <subNodeX/>
        </nodeB>
    </nodes>
</root>
require 'nokogiri'
require 'set'

xml = Nokogirl::XML.parse(your_data)
paths = Set.new
xml.traverse {|node| next if node.text?; paths << node.path.gsub(/\[\d+\]/,"").sub(/\/$/,"")}
xml.traverse do |node|
  next if node.text?
  paths << (npath = node.path.gsub(/\[\d+\]/,"").sub(/\/$/,""))
  paths += node.attributes.map {|k,v| "#{npath}@#{k}"}
end