List转树形结构

import lombok.Data;

import java.util.ArrayList;
import java.util.List;

@Data
public class TreeNode {
    private Long id;
    private Long parentId;
    private String name;
    private List<TreeNode> children = new ArrayList<>();

    public TreeNode(Long id, Long parentId, String name) {
        this.id = id;
        this.parentId = parentId;
        this.name = name;
    }
}
package service.treenode;

import com.alibaba.fastjson.JSON;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class ListToTreeConverter {

    public static void main(String[] args) {
        List<TreeNode> nodeList = new ArrayList<>();

        // 添加一些节点示例
        nodeList.add(new TreeNode(1L, null, "根节点1"));
        nodeList.add(new TreeNode(2L, 1L, "子节点1"));
        nodeList.add(new TreeNode(3L, 1L, "子节点2"));
        nodeList.add(new TreeNode(4L, 2L, "孙节点1"));
        nodeList.add(new TreeNode(5L, 2L, "孙节点2"));
        nodeList.add(new TreeNode(6L, 5L, "曾孙节点1"));

        List<TreeNode> treeNodes = ListToTreeConverter.convertListToTree2(nodeList);
        System.out.println(JSON.toJSONString(treeNodes));
    }


    public static List<TreeNode> convertListToTree(List<TreeNode> nodeList) {
        List<TreeNode> rootNodes = new ArrayList<>();

        for (TreeNode node : nodeList) {
            if (node.getParentId() == null) {
                rootNodes.add(node);
            } else {
                for (TreeNode parentNode : nodeList) {
                    if (parentNode.getId().equals(node.getParentId())) {
                        parentNode.getChildren().add(node);
                        break;
                    }
                }
            }
        }
        return rootNodes;
    }


    public static List<TreeNode> convertListToTree2(List<TreeNode> nodeList) {
        // 先找出所有根节点(parentId为null的节点)
        List<TreeNode> rootNodes = nodeList.stream()
                .filter(node -> node.getParentId() == null)
                .collect(Collectors.toList());

        // 对于每个非根节点,找到其对应的父节点并添加到父节点的children列表中
        nodeList.stream()
                .filter(node -> node.getParentId()!= null)
                .forEach(node -> {
                    TreeNode parentNode = nodeList.stream()
                            .filter(parent -> parent.getId() == node.getParentId())
                            .findFirst()
                            .orElse(null);
                    if (parentNode!= null) {
                        parentNode.getChildren().add(node);
                    }
                });

        return rootNodes;
    }
}
posted @   亲爱的阿道君  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2017-12-03 node.js
点击右上角即可分享
微信分享提示