JavaSE-父子id集合构建为树tree结构-示例

发布时间 2023-11-22 16:05:13作者: 生生灯火半杯月
public class Node {

    private final Type type;
    private final List<Node> children;

    public Node(Type type) {
        this.type = type;
        this.children = new ArrayList<>();
    }

    public Type getType() {
        return type;
    }

    public List<Node> getChildren() {
        return children;
    }

    public static Collection<Node> createTree(List<Type> types) {
        Map<Long, Node> nodes = new HashMap<>();

        for (Type type : types) {
            if (!nodes.containsKey(type.getId())) {
                Node node = new Node(type);
                nodes.put(type.getId(), node);
            }
        }

        for (Type type : types) {
            Node node = nodes.get(type.getId());
            for (Type descendant : types) {
                if (descendant.getParentId() != null && descendant.getParentId() == type.getId()) {
                    node.getChildren().add(nodes.get(descendant.getId()));
                }
            }
        }

        return nodes.values().stream()
                .filter(node -> node.getType().getParentId() == 0)
                .collect(Collectors.toList());
    }

    @Override
    public String toString() {
        return "Node{" +
                "type=" + type +
                ", children=" + children +
                '}';
    }

    public static void main(String[] args) {
        List<Type> types = Arrays.asList(
                new Type(1L, "a", "Parent A", 0L),
                new Type(2L, "b", "Child B of A", 1L),
                new Type(3L, "c", "Child C of A", 1L),
                new Type(4L, "d", "Grandchild D of A", 2L),
                new Type(5L, "e", "Grandchild E of A", 3L),
                new Type(6L, "f", "Parent F", 0L),
                new Type(7L, "g", "Child G of F", 6L)
        );

        System.out.println(createTree(types));
    }
}