2015-04-06 3 views
0

Я делаю генеалогическое древо. Итак, я формирую заказ от самого старого до нового члена семьи.Как помещать массив в массив в Ruby

Для этого я формирую массив, который имеет структуру окончательного дерева, а затем я печатаю результат только.

В PHP я могу сделать что-то вроде этого:

Array(
'member1' => [ 
    'sub_member11' => [ 
    ['sub_sub_member111' => some_value_of_sons], 
    ['sub_sub_member112' => some_value_of_sons] 
    ], 
    ['sub_member12' => some_value_of_sons] 
], 
'member2' => [ 
    ['sub_member21' => some_value_of_sons], 
    ['sub_member22' => some_value_of_sons] 
] 
) 

В Ruby, я хотел бы сделать что-то вроде этого. Извините за мой английский.

+0

В Ruby, который считается хешем, но в любом случае, это легко в Ruby. Вы что-то пробовали? Посмотрите на «Ruby hash». – lurker

+2

Вы можете использовать хэш или другую большую структуру данных, но вы потеряете выразительность Ruby. Я предлагаю создать класс или использовать существующий класс, например RubyTree. –

+1

@ У MarkThomas лучший ответ. Если вы строите генеалогическое древо, вы должны использовать структуру данных дерева. Тогда ваши данные, естественно, будут сопоставляться с структурой данных. –

ответ

0

Я предложил бы использовать RubyTree для этого, а не structu данных число рейнольдса Есть несколько преимуществ:

  • Некоторые из запросов, возможно, потребуется сделать уже реализованы эффективно
  • Схема присвоения имен совпадают с доменом (родитель/прародитель/братьями и сестрами/детей и т.д.)
  • Это сократит ваш код значительно и сделать его легче читать
  • есть встроенные способы пересекающих и распечатать дерево

Вот выдержка из документации, которая поможет вам получить плату л для него:

require 'tree'  

# ..... Create the root node first. Note that every node has a name and an optional content payload. 
root_node = Tree::TreeNode.new("ROOT", "Root Content") 
root_node.print_tree 

# ..... Now insert the child nodes. Note that you can "chain" the child insertions for a given path to any depth. 
root_node << Tree::TreeNode.new("CHILD1", "Child1 Content") << Tree::TreeNode.new("GRANDCHILD1", "GrandChild1 Content") 
root_node << Tree::TreeNode.new("CHILD2", "Child2 Content") 

# ..... Lets print the representation to stdout. This is primarily used for debugging purposes. 
root_node.print_tree 

# ..... Lets directly access children and grandchildren of the root. The can be "chained" for a given path to any depth. 
child1  = root_node["CHILD1"] 
grand_child1 = root_node["CHILD1"]["GRANDCHILD1"] 

# ..... Now lets retrieve siblings of the current node as an array. 
siblings_of_child1 = child1.siblings 

# ..... Lets retrieve immediate children of the root node as an array. 
children_of_root = root_node.children 

Примечание что примеры показывают содержимое узла в виде строки, но вы можете поместить туда любой объект. Вы можете создать объект значения для хранения всех ваших метаданных.

class FamilyMember 
    attr_accessor :name :last_name, :maiden_name, :birth_date, :etc 
end 

Надеюсь, после того, как делать все это код будет больше похож uncle_bob.children.first.birth_date - очень читаемым.

3

Я думаю, что вы ищете тип данных Ruby's Hash. Вы можете создать новый хэш, используя синтаксис вроде этого:

{ key1 => value1, key2 => value2 } 

Таким образом, вы могли бы сделать хэш с вашими нужными данными в нем в письменной форме:

hash = { 
    'member1' => { 
    'sub_member11' => { 
     'sub_sub_member111' => some_value_of_sons, 
     'sub_sub_member112' => some_value_of_sons, 
    }, 
    'sub_member12' => some_value_of_sons, 
    }, 
    'member2' => { 
    'sub_member21' => some_value_of_sons, 
    'sub_member22' => some_value_of_sons, 
    }, 
} 

Хэши используются очень часто в программах на Ruby, так это окупится, чтобы понять их и прочитать документацию:

http://ruby-doc.org/core/Hash.html

Смежные вопросы