Frage

Ich bin ein Ruby-Skript zu schreiben und möchte eine n-äre Baumdatenstruktur verwenden.

Gibt es eine gute Implementierung, die als Quellcode verfügbar ist? Danke.

War es hilfreich?

Lösung

Um auf Ottos Antwort zu erweitern, eine einfache Möglichkeit, einen Hash zu bekommen von Auto-vivify Arrays ist den Standardwerteblock mit Hash::new zu verwenden, etwa so:

node_children = Hash.new { |_node_children, node_key| _node_children[node_key] = [] }

Aber wirklich, hängt der Code auf das, was Sie mit Ihrem Arrays tun wollen. Du kannst entweder setzte sie sich mit Hashes und Arrays, oder einige Klassen machen:

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

Dieser Code zum Beispiel gibt:

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

Andere Tipps

Ein Hash, dessen Attribute sind alle Arrays?

Das RubyTree gem großartig für mich gearbeitet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top