Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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 on rails中从2d数组转换为嵌套的_集_Ruby_Csv_Ruby On Rails Plugins_Multidimensional Array_Nested Sets - Fatal编程技术网

在Ruby on rails中从2d数组转换为嵌套的_集

在Ruby on rails中从2d数组转换为嵌套的_集,ruby,csv,ruby-on-rails-plugins,multidimensional-array,nested-sets,Ruby,Csv,Ruby On Rails Plugins,Multidimensional Array,Nested Sets,我在.csv文件中有一个树结构(节点类型为text),读取csv后,我想将数据存储在一个ruby对象中。我浏览了一些树插件,我认为嵌套的_集可以满足我的需要。 然而,我在修复csv文件的格式时遇到了问题,这样我就可以读取它并将其转换为树对象。是否有任何直接的方法将csv文件或二维数组转换为树数据结构???在您阐明不需要将此树存储在数据库中后,我建议扔掉嵌套集(它们将对象的嵌套集存储在RDBMS上,您不需要)。我需要一棵简单的树 class Node attr_accessor :parent

我在.csv文件中有一个树结构(节点类型为text),读取csv后,我想将数据存储在一个ruby对象中。我浏览了一些树插件,我认为嵌套的_集可以满足我的需要。
然而,我在修复csv文件的格式时遇到了问题,这样我就可以读取它并将其转换为树对象。是否有任何直接的方法将csv文件或二维数组转换为树数据结构???

在您阐明不需要将此树存储在数据库中后,我建议扔掉嵌套集(它们将对象的嵌套集存储在RDBMS上,您不需要)。我需要一棵简单的树

class Node
  attr_accessor :parent, :children, :text

  def initialize(text)
    @text = text
    @children = []
  end
end
由于我有权选择CSV文件的格式,因此我建议如下:

id,parent,text
1,,"1"
2,1,"1.1"
3,1,"1.2"
3,2,"1.1.1"
树根是第一行,没有父级,父级总是在其子级之前声明的。这样你就可以建一棵树

def build_tree(rows)
  nodes = {}
  rows.each do |row|
    node = Node.new(row[:text])
    nodes[row[:id]] = node

    node.parent = nodes[row[:parent]]
    nodes[row[:parent]].children << node if row[:parent]
  end

  nodes.values.find {|node| node.parent.nil? }
end

root = build_tree(rows)
root.text #=> "1"
root.children.map(&:text) #=> ["1.1", "1.2"]
root.children[0].children.map(&:text) #=> ["1.1.1"]

看起来你根本不需要使用ORM。为什么不自己制作树逻辑,使用Ruby之类的动态语言,这非常简单:

require 'set'

# expects an array of [parent, child] pairs, returns the root element of a tree
def make_tree a
  tree = {}

  a.each do |p, c|
    tree[p] ||= {:value => p}
    tree[p][:children] ||= Set.new
    tree[c] ||= {:value => c}
    tree[c][:parent] = tree[p]
    tree[p][:children] << tree[c]
  end

  tree.values.find{|e| e[:parent].nil?}
end

root = make_tree [[1,2],[3,4],[1,3],[4,5]]

puts root.inspect
puts root[:value]
require'set'
#需要一个[parent,child]对数组,返回树的根元素
把树变成一棵树
树={}
a、 每个do | p,c|
树[p]| |={:value=>p}
tree[p][:children]| |=Set.new
树[c]| |={:value=>c}
树[c][:父]=树[p]

tree[p][:children]在.csv文件中的树结构是什么样子的?这是有待决定的。我必须在csv中存储150个标签,它们遵循树结构。每个标签也会有一个值,在运行时会更改。我不想将对象持久化到数据库中。它将保存在会话中,并在会话到期后销毁。嘿,老兄,你偷了我的答案…;)+1用于改进已有的好主意…;)不过有一点需要注意:您的函数要求节点按自上而下的顺序,即,如果您尝试按随机顺序添加节点(先添加子节点,然后再添加父节点),它将无法工作。@Mladen Jablanović没错。我可以选择CSV文件的格式,所以我选择了更简单的方法——按自上而下的顺序排列节点。随机排序行的版本在Answer的第一个版本中。get_节点方法和用法刚刚救了我的命。至少在我的书中称之为“递归展平”。我有一个通用的对象树层次结构,您允许我通过许多递归级别按属性进行搜索/展平。谢谢。我想要一个树数据结构,其中每个节点都有一个名称、id和值。我决定使用嵌套的_net,因为整个子树的节点的值字段在运行时会发生变化,而嵌套的树提供了这个功能。我也曾想过自己设计一棵树,但认为rails插件可能会提供更好的性能。你有什么建议?我没有使用嵌套的集合,所以我不能告诉你是否可以或者应该使用它。如果您想根据您的需要调整我的答案,1)在创建节点时向节点的哈希中添加名称和id键,或者使用MBO建议的节点类,2)创建方法来遍历给定节点的子树并执行提供的块,这将使您能够为每个子树节点设置值。
require 'set'

# expects an array of [parent, child] pairs, returns the root element of a tree
def make_tree a
  tree = {}

  a.each do |p, c|
    tree[p] ||= {:value => p}
    tree[p][:children] ||= Set.new
    tree[c] ||= {:value => c}
    tree[c][:parent] = tree[p]
    tree[p][:children] << tree[c]
  end

  tree.values.find{|e| e[:parent].nil?}
end

root = make_tree [[1,2],[3,4],[1,3],[4,5]]

puts root.inspect
puts root[:value]