Java 实现 List 转 多根节点树形结构,高效避免死循环和层级限制
下面是一个Java实现的例子,将一个List转换为多个根节点的树形结构,同时避免死循环和层级限制为10层:\n\njava\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\npublic class ListToTree {\n    private static final int MAX_LEVEL = 10;\n\n    public static List<Node> convertToTree(List<Node> list) {\n        // 创建一个Map,用于存储每个节点的id和对应的节点对象\n        Map<Integer, Node> nodeMap = new HashMap<>();\n        // 创建一个List,用于存储根节点\n        List<Node> roots = new ArrayList<>();\n\n        // 遍历list,将每个节点添加到nodeMap中\n        for (Node node : list) {\n            nodeMap.put(node.getId(), node);\n        }\n\n        // 遍历list,将每个节点的父节点设置好\n        for (Node node : list) {\n            int parentId = node.getParentId();\n            if (parentId == 0) {\n                // 如果节点的parentId为0,表示该节点是根节点\n                roots.add(node);\n            } else {\n                // 获取父节点对象\n                Node parent = nodeMap.get(parentId);\n                if (parent != null) {\n                    // 将节点添加到父节点的子节点列表中\n                    parent.addChild(node);\n                }\n            }\n        }\n\n        return roots;\n    }\n\n    public static void main(String[] args) {\n        // 创建一个测试数据集合\n        List<Node> list = new ArrayList<>();\n        list.add(new Node(1, 0, "Root1"));\n        list.add(new Node(2, 1, "Child1.1"));\n        list.add(new Node(3, 1, "Child1.2"));\n        list.add(new Node(4, 2, "Grandchild1.1.1"));\n        list.add(new Node(5, 2, "Grandchild1.1.2"));\n        list.add(new Node(6, 3, "Grandchild1.2.1"));\n        list.add(new Node(7, 3, "Grandchild1.2.2"));\n\n        // 将list转换为多个根节点的树形结构\n        List<Node> roots = convertToTree(list);\n\n        // 输出树形结构\n        for (Node root : roots) {\n            printNode(root, 0);\n        }\n    }\n\n    public static void printNode(Node node, int level) {\n        StringBuilder sb = new StringBuilder();\n        for (int i = 0; i < level; i++) {\n            sb.append("  ");\n        }\n        sb.append(node.getName());\n        System.out.println(sb.toString());\n\n        List<Node> children = node.getChildren();\n        if (children != null) {\n            for (Node child : children) {\n                printNode(child, level + 1);\n            }\n        }\n    }\n}\n\nclass Node {\n    private int id;\n    private int parentId;\n    private String name;\n    private List<Node> children;\n\n    public Node(int id, int parentId, String name) {\n        this.id = id;\n        this.parentId = parentId;\n        this.name = name;\n        this.children = new ArrayList<>();\n    }\n\n    public int getId() {\n        return id;\n    }\n\n    public int getParentId() {\n        return parentId;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public List<Node> getChildren() {\n        return children;\n    }\n\n    public void addChild(Node child) {\n        children.add(child);\n    }\n}\n\n\n在上面的示例中,我们创建了一个Node类来表示树的节点。每个节点包含一个id、parentId和name属性,以及一个children列表来存储其子节点。\n\nconvertToTree方法接受一个List参数,其中每个元素都是一个Node对象。首先,我们创建了一个HashMap来存储每个节点的id和对应的节点对象。然后,我们遍历List,将每个节点添加到HashMap中。接下来,我们再次遍历List,为每个节点设置父节点。如果一个节点的parentId为0,则表示该节点是根节点,我们将其添加到根节点列表中。否则,我们通过父节点的id从HashMap中获取父节点对象,并将当前节点添加到父节点的children列表中。\n\n最后,我们调用printNode方法来打印树形结构。该方法使用递归的方式遍历树的节点,并根据节点的层级打印相应的缩进。\n\n注意:在实际使用中,可能需要根据具体的业务需求对Node类进行适当的扩展和修改。此示例仅提供了一个基本的实现思路。
原文地址: https://www.cveoy.top/t/topic/pG5N 著作权归作者所有。请勿转载和采集!