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