2009-02-01 2 views

답변

11

에 해시를 얻는 쉬운 방법 자동-생생하게 배열은과 같이, 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 
5

속성이 모두 배열 인 해시가 있습니까? 오토의 대답에 확장하려면