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 @ 2024-12-03 16:34  亲爱的阿道君  阅读(39)  评论(0)    收藏  举报