假设我们有一个平铺列表,每个元素都有一个唯一的 ID 和一个父 ID,我们需要将其构建为树结构。以下是一种可能的 Java 实现:

import java.util.*;

public class TreeBuilder {
    public static class TreeNode {
        public String id;
        public List<TreeNode> children;
        
        public TreeNode(String id) {
            this.id = id;
            this.children = new ArrayList<>();
        }
    }
    
    public static List<TreeNode> buildTree(List<Map<String, String>> flatList) {
        Map<String, TreeNode> idToNode = new HashMap<>();
        for (Map<String, String> item : flatList) {
            String id = item.get('id');
            String parentId = item.get('parentId');
            TreeNode node = idToNode.getOrDefault(id, new TreeNode(id));
            idToNode.put(id, node);
            if (parentId != null) {
                TreeNode parent = idToNode.getOrDefault(parentId, new TreeNode(parentId));
                idToNode.put(parentId, parent);
                parent.children.add(node);
            }
        }
        List<TreeNode> roots = new ArrayList<>();
        for (TreeNode node : idToNode.values()) {
            if (node.id.equals('root') || node.children.size() > 0) {
                roots.add(node);
            }
        }
        return roots;
    }
}

在这里,我们定义了一个 TreeNode 类来表示树节点,其中包含一个 ID 和一个子节点列表。我们的 buildTree 方法接受一个平铺列表,并将其转换为树结构。我们首先遍历平铺列表,将每个元素的 ID 和父 ID 映射到相应的树节点上。如果节点还没有被创建,我们就创建一个新的节点。如果父 ID 不为空,我们就将该节点添加到父节点的子节点列表中。最后,我们遍历所有节点,找到没有父节点或有子节点的节点,将其添加到根节点列表中,并返回该列表。

使用示例:

List<Map<String, String>> flatList = new ArrayList<>();
flatList.add(Map.of('id', '1', 'parentId', 'root'));
flatList.add(Map.of('id', '2', 'parentId', '1'));
flatList.add(Map.of('id', '3', 'parentId', '1'));
flatList.add(Map.of('id', '4', 'parentId', '2'));
flatList.add(Map.of('id', '5', 'parentId', '2'));
flatList.add(Map.of('id', '6', 'parentId', '3'));
flatList.add(Map.of('id', '7', 'parentId', '3'));

List<TreeNode> roots = TreeBuilder.buildTree(flatList);
for (TreeNode root : roots) {
    System.out.println(root.id);
    for (TreeNode child : root.children) {
        System.out.println('- ' + child.id);
        for (TreeNode grandchild : child.children) {
            System.out.println('-- ' + grandchild.id);
        }
    }
}

输出结果:

1
- 2
-- 4
-- 5
- 3
-- 6
-- 7

原文地址: https://www.cveoy.top/t/topic/mSOE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录