【问题标题】:Recursive through List-Elements, which can have List too通过 List-Elements 递归,它也可以有 List
【发布时间】:2016-06-28 10:07:27
【问题描述】:

我正在寻找一种合适的递归方式来实现以下目标: 元素 A 可以有一个列表 L1,其中包含更多元素,例如 A,例如B、C 和 D。这些元素(B、C 和 D)也可以有一个列表 L2、L3、L4。 所以我也需要浏览这些列表。 背景是我想从名称末尾包含“LB”的所有元素的所有列表中获取所有对象(由getName()检索)。列表的所有对象都具有相同的类型。 我如何做到这一点?由于我不知道会有多少元素和列表,我认为递归解决方案是唯一合适的解决方案?

【问题讨论】:

  • 您的列表将被存储为类属性或者它们将在根列表中?

标签: java recursion


【解决方案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));
}

这称为深度优先遍历。

【讨论】:

  • 哇,这似乎很难实现。我将如何用我的数据填充这棵树以及如何在这棵树中搜索一个节点?
  • @BlackACE:查一下Java中的树实现,网上应该有很多。
  • @sotix +1。我建议 Guava 的 TreeTraverser
【解决方案2】:

您可以使用平面图: 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());

【讨论】:

  • 这适用于一级嵌套,但不适用于任意深度
猜你喜欢
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 2022-12-02
相关资源
最近更新 更多