如何遍历未知深度节点列表并计算选中节点score总和(Java 8)
计算选中节点的Score总和(Java 8实现)
给定一个层级深度未知的Node结构,每个节点包含score数值、selected选中状态,以及子节点列表subNodes,需要借助Java 8特性计算所有selected为true的节点的score总和。
Node类定义
class Node { int score; boolean selected; List<Node> subNodes; // 符合Java Bean规范的getter方法 public int getScore() { return score; } public boolean isSelected() { return selected; } public List<Node> getSubNodes() { return subNodes; } }
核心思路与实现
解决问题的关键是扁平化嵌套的节点结构,将所有层级的节点转换为连续流,再通过Stream API完成过滤、求和操作。
1. 递归式扁平化(简洁优先)
通过递归结合flatMap,将单个节点及其所有子节点转换为Stream<Node>:
private static Stream<Node> flattenNode(Node node) { // 合并当前节点流与子节点递归扁平化后的流 return Stream.concat( Stream.of(node), node.getSubNodes() != null ? node.getSubNodes().stream().flatMap(YourClassName::flattenNode) : Stream.empty() ); } // 扩展为处理节点列表的方法 private static Stream<Node> flattenNodes(List<Node> nodeList) { return nodeList != null ? nodeList.stream().flatMap(YourClassName::flattenNode) : Stream.empty(); }
2. 计算总和
利用Stream API的链式操作直接得到结果:
// yourNodeList为初始节点列表 int totalSelectedScore = flattenNodes(yourNodeList) .filter(Node::isSelected) // 筛选选中的节点 .mapToInt(Node::getScore) // 提取score转为int流 .sum(); // 求和
3. 迭代式扁平化(避免栈溢出)
如果节点层级极深,递归可能引发栈溢出,可改用迭代式广度优先遍历实现扁平化:
private static Stream<Node> flattenNodeIterative(Node root) { Queue<Node> queue = new LinkedList<>(); queue.add(root); return Stream.generate(() -> { Node node = queue.isEmpty() ? null : queue.poll(); if (node != null && node.getSubNodes() != null) { queue.addAll(node.getSubNodes()); } return node; }).takeWhile(Objects::nonNull); } // 处理列表的迭代版本 private static Stream<Node> flattenNodesIterative(List<Node> nodeList) { if (nodeList == null || nodeList.isEmpty()) { return Stream.empty(); } Queue<Node> queue = new LinkedList<>(nodeList); return Stream.generate(() -> { Node node = queue.isEmpty() ? null : queue.poll(); if (node != null && node.getSubNodes() != null) { queue.addAll(node.getSubNodes()); } return node; }).takeWhile(Objects::nonNull); }
使用迭代版本计算总和时,只需将flattenNodes替换为flattenNodesIterative即可。
内容的提问来源于stack exchange,提问作者j3d
相关产品推荐
相关产品推荐

