You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历未知深度节点列表并计算选中节点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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 08:40:31