Я пишу скрипт Ruby и хотел бы использовать структуру данных n-арного дерева.«Рубиновый» способ создания n-арного дерева
Есть ли хорошая реализация, доступная в качестве исходного кода? Благодарю.
Я пишу скрипт Ruby и хотел бы использовать структуру данных n-арного дерева.«Рубиновый» способ создания n-арного дерева
Есть ли хорошая реализация, доступная в качестве исходного кода? Благодарю.
Чтобы расширить ответ Отто, легкий способ получения хэша для автоматического оживлять массивов заключается в использовании блока значение по умолчанию с Hash::new
, например, так:
node_children = Hash.new { |_node_children, node_key| _node_children[node_key] = [] }
Но на самом деле, код зависит от того, что вы хотите делать с вашими массивами. Вы можете установить их с хэши и массивы, или сделать несколько классов:
class Node
attr_accessor :value, :children
def initialize(value, children=[])
@value = value
@children = children
end
def to_s(indent=0)
value_s = @value.to_s
sub_indent = indent + value_s.length
value_s + @children.map { |child| " - " + child.to_s(sub_indent + 3) }.join("\n" + ' ' * sub_indent)
end
end
ROOT = Node.new('root', %w{ farleft left center right farright }.map { |str| Node.new(str) })
puts "Original Tree"
puts ROOT
puts
ROOT.children.each do |node|
node.children = %w{ one two three four }.map { |str| Node.new(node.value + ':' + str) }
end
puts "New Tree"
puts ROOT
puts
Этот код, например, дает:
Original Tree
root - farleft
- left
- center
- right
- farright
New Tree
root - farleft - farleft:one
- farleft:two
- farleft:three
- farleft:four
- left - left:one
- left:two
- left:three
- left:four
- center - center:one
- center:two
- center:three
- center:four
- right - right:one
- right:two
- right:three
- right:four
- farright - farright:one
- farright:two
- farright:three
- farright:four
Хэш, чьи атрибуты - все массивы?
RubyTree камень работал большой для меня.