我有内部节点和终端节点的树状结构:
public interface Node
{
}
public class InternalNode implements Node {
private List<Node> nodes;
}
public class TerminalNode implements Node {
private String label;
}
我现在有一个列表
我想出了这个函数:
private static List<Node> flatten(final List<Node> nodes) {
return nodes
.stream()
.map(node -> {
if (node instanceof InternalNode) {
return flatten(((InternalNode) node).getNodes());
}
return Collections.singletonList(node);
})
.flatMap(List::stream)
.collect(Collectors.toList());
}
这似乎完成了它的工作。然而,我想知道是否有更好的实现可能。奇怪的是,我首先必须将
TerminalNode
包装成一个单例列表(类型为List
有没有办法避免这个无用的
Collections.singletonList(节点)
后面跟着平映射(列表::流)
的终端节点?
您可以直接使用flatMap:
private static Stream<TerminalNode> flatten(final List<Node> nodes) {
return nodes
.stream()
.flatMap(node -> {
if (node instanceof InternalNode) {
return flatten(((InternalNode) node).getNodes());
}
return Stream.of((TerminalNode) node);
});
}
如果想要列表,只需收集该方法调用的结果即可。
问题内容: 我是一名编程新手,在理解python教科书(Magnus Lie Hetland的“ Beginning Python”)中的示例时遇到了一些麻烦。该示例针对的是递归生成器,该生成器旨在展平嵌套列表的元素(具有任意深度): 然后,您将输入嵌套列表,如下所示: 我了解flatten()中的递归如何帮助缩小到此列表的最内层元素“ 1”,但是我不明白的是当“ 1”实际上作为“嵌套”传递回fl
我正在练习并试图写一个递归数组扁平化函数。代码在这里: 问题是,如果我将一个数组或嵌套数组传递给它,就会出现“超出最大调用堆栈大小”错误。我做错了什么?
问题内容: 我想使用Java 8递归列出计算机上的所有文件。 Java 8提供了一种返回所有文件和目录但不递归的方法。如何使用它来获取完整的文件递归列表(不使用变异集合)? 我尝试了下面的代码,但仅深入了一层: 而且使用不会编译(不确定原因)… 注意:我对涉及FileVisitors或外部库的解决方案不感兴趣。 问题答案: 通过递归遍历文件系统生成路径路径流的新API是。 如果您真的想递归地生成流
并使用不编译(不确定原因)... 注意:我对涉及FileVisitors或外部库的解决方案不感兴趣。
问题内容: 我想展平一个将键关联到的列表的a ,而不会丢失键映射。我很好奇,就好像它是可能的,与这样做有用的和。 我们从这样的东西开始: 假设mapFrom填充在某处,如下所示: 我们还假设列表中的值是唯一的。 现在,我想“展开”它以获得第二张地图,例如: 我可以这样做(或使用,非常类似): 现在,假设我要使用lambda而不是嵌套循环。我可能会做这样的事情: 我也尝试了,但是我不认为这是正确的方
问题内容: 我想扩展一些递归的属性(又名深度复制)。就像jQuery一样。我不只包括jquery一件事的b / c。 您知道有什么优雅的方法可以使用简单的javascript或angularjs吗? 更新, 请看看并尝试完成相同的结果 http://plnkr.co/edit/GHabYbyhsqtfBPtplksO?p=preview 我确实调查了.copy()但“属性(对象)已删除” 问题答案