2014-10-02 3 views
-1

Я пытаюсь преобразовать в следующий массив массивTransform массив массив из всех первых элементов

[ 
    "master_type", # [0] 
    [ 
    "type_1", # [1][0] 
    [ 
     "type_2", # [1][1][0] 
     [ 
     "type_3" # [1][1][1][0] 
     ] 
    ], 
    [ 
     "type_3" # [1][2][0] 
    ] 
    ], 
    [ 
    "type_4", # [2][0] 
    [ 
     "type_2" # [2][1][0] 
    ] 
    ], 
    [ 
    "type_2", # [3][0] 
    "type_3"  # [3][1] 
    ], 
    "type_3"  # [3][1] 
] 

в нечто вроде

[ 
    ["master_type", "type_1", "type_2", "type_3"], 
    ["master_type", "type_1", "type_3"], 
    ["master_type", "type_4", "type_2"], 
    ["master_type", "type_2", "type_3"], 
    ["master_type", "type_3"] 
] 

Наконец, я хотел бы, чтобы прочитать это дерево и собрать все первые элементы, когда есть первые элементы, затем удаляют их, прежде чем делать это снова, пока мой первый массив не будет пустым.

Я не могу это исправить. У тебя есть идеи ?

Важно отметить, что этот пример со строками, но я буду делать это с более сложными объектами

Спасибо заранее.

+2

Пожалуйста, покажите, что вы пробовали до сих пор. –

+0

Я не делал ничего, что работает немного. Я просто имею в виду алгоритм, но я не могу его решить. – BriceB

+3

Что это за '[0]', '[1]', '[2]', ...? – Stefan

ответ

1

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

def flatten_tree(tree) 
    parent, *subtree = tree 

    return [[parent]] if subtree.empty? 

    subtree.flat_map do |element| 
    flatten_tree(element).each { |children| children.unshift(parent) } 
    end 
end 

Ответ был обновлен в соответствии с комментариями Саввы.

+1

Хороший ответ. Хотя, поскольку вы используете 'unshift', вы можете изменить' map' на 'each', что будет более эффективным. – sawa

+1

Вы также можете опустить символ '*' перед 'массивом'. – sawa

+0

Это именно то, чего я ожидал. Спасибо ! Для меня это прекрасно, потому что мои деревья не так глубоки. Он отлично работает. – BriceB

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