2016-06-28 3 views
0

Я ищу подходящий рекурсивный способ достижения следующих результатов: Элемент A может иметь список L1, который содержит дополнительные элементы, такие как A, например. B, C и D. Эти элементы (B, C и D) также могут иметь список L2, L3, L4. Так что мне тоже нужно пройти эти списки. Фоном является то, что я хочу получить все объекты из всех списков всех элементов, которые содержат «LB» в конце их имени (извлекается getName()). Все объекты списков имеют один и тот же тип. Как я этого добиваюсь? Поскольку я не знаю, сколько будет элементов и списков, я думаю, что рекурсивное решение является единственным правильным?Рекурсивные элементы List-Elements, которые также могут иметь список

+0

Ваши списки будут сохранены как свойства класса, или они будут находиться в корневом списке? –

ответ

1

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

class Node<T>{ 
    T value; 
    List<Node<T>> children = new ArrayList<>(); 
} 

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

public <T> void visit(Node<T> rootNode, Consumer c){ 
    c.consume(rootNode.value); 
    rootNode.children.forEach(n -> visit(n, c)); 
} 

Это называется пересечение глубины.

+0

Wow thats кажется довольно сложно реализовать. Как заполнить это дерево моими данными и как я буду искать узел внутри этого дерева? – BlackACE

+0

@BlackACE: Посмотрите на реализацию дерева в Java, должно быть много онлайн. – sotix

+0

@sotix +1. Я бы предложил Guava ['TreeTraverser'] (http://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/TreeTraverser.html) класс –

0

Вы можете использовать flatmap: https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#flatMap-java.util.function.Function-

Какой "придавить" Список/массив.

Например:

l1.stream().flatMap(Collection::stream).map(e-> e.getName()).filter(e -> e.contains("LB")).collect(Collectors.joining()); 
+0

Это хорошо работает с одним уровень гнездования, но не с произвольной глубиной –

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