У меня большой Json объект. Объект описывает среди прочего отношение типа дерева того, как его компоненты объектов связаны между собой иерархически. Объект знает, кто его дети, но не знает (напрямую), кто его родитель. «my_ha sh» ниже иллюстрирует структуру. Каждый объект имеет идентификатор 101, 102, et c., Имя «one», «two» et c и может иметь 0, 1 или более дочерних элементов. Я пытаюсь построить «путь» к каждому объекту. Например, имя объекта «пять» должно в результате иметь путь «/ один / два / четыре» в результате кода. По сути, я пытаюсь построить своего рода структуру каталогов иерархии объектов.
Код ниже работает, но выглядит довольно долго 'i sh, не очень элегантно, не очень Ruby' я sh. Буду признателен за предложение о том, как сделать это более эффективно и элегантно. И я понял, что мой код может быть не очень надежным, ie хорошо справляется с исключениями. Любые мысли или помощь приветствуются.
Кстати, я только учусь Ruby и до сих пор программировал в основном на Perl.
class Tree
def initialize
@my_hash = {
101 => ["one", [102, 107]],
102 => ["two", [103, 104]],
103 => ["three", []],
104 => ["four", [105, 106]],
105 => ["five", []],
106 => ["six", []],
107 => ["seven", [108]],
108 => ["eight", []],
}
@child_to_parent_node = {}
@id_to_name = {}
@my_path_hash = {}
@my_hash.keys.each do |key|
@my_path_hash[key] = ""
end
@parent_path_id = []
end
def map_child_to_parent
@my_hash.each do |key, value|
@id_to_name.store(key, value[0])
node_name, children = value[0], value[1]
children.each do |child_id|
@child_to_parent_node.store(child_id, node_name)
end
end
end
def build_path(id)
parent = @child_to_parent_node[id]
parent.nil? ? return : @parent_path_id << parent
id = @id_to_name.key(parent)
build_path(id)
@parent_path_id
end
def update_tree
@id_to_name.keys.each do |id|
tmp_array = self.build_path(id)
path = ""
if (tmp_array.nil?)
path = "/"
else
tmp_array.reverse.each do
path = path + "/" + tmp_array.pop
end
end
puts "id: #{id} path: #{path}"
end
end
end
my_tree = Tree.new
my_tree.map_child_to_parent
my_tree.update_tree