栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java 处理树形结构 树形转为list list转为树形

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 处理树形结构 树形转为list list转为树形

java 处理树形结构 树形转为list list转为树形
  • 树形转为list
  • 每个节点对祖级列表的编号List赋值
  • list转为树形

实体类结构:

@Data
@NoArgsConstructor
@AllArgsConstructor
class Node {
    // id
    private Integer id;
    // 父id
    private Integer pId;
    // 名称
    private String name;
    // 祖级id列表
    private List ancestors;
    // 子节点
    private List children;

    public Node(int id, int pId, String name) {
        this.id = id;
        this.pId = pId;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Node{" +
                "id=" + id +
                ", pId=" + pId +
                ", name='" + name + ''' +
                ", ancestors=" + ancestors +
                ", children=" + children +
                '}';
    }
}
树形转为list
	@Test
    public void test01() {
        // 填充数据
        Node level4 = new Node(4, 3, "level4-01");
        Node level3 = new Node(3, 2, "level3-01");
        Node level2 = new Node(2, 1, "level2-01");
        Node level22 = new Node(22, 1, "level2-02");
        Node level1 = new Node(1, 0, "level1-01");
        List level3children = new ArrayList<>();
        level3children.add(level4);
        level3.setChildren(level3children);
        List level2children = new ArrayList<>();
        level2children.add(level3);
        level2.setChildren(level2children);
        List children = new ArrayList<>();
        children.add(level2);
        children.add(level22);
        level1.setChildren(children);
        System.out.println(level1.toString());
        System.out.println("===============before===============");
        // 树形转为list
        List result = new ArrayList<>();
        this.recursionTreeToList(result, level1, null);
        for (Node node : result) {
            node.setChildren(null);
            System.out.println(node.toString());
        }
        System.out.println("===============after===============");
    }
    
    public void recursionTreeToList(List result, Node root, Node parentNode) {
        // 如果没有pid那么就赋值
       
        result.add(root);
        if (CollectionUtils.isEmpty(root.getChildren())) {
            return;
        }
        for (Node child : root.getChildren()) {
            this.recursionTreeToList(result, child, root);
        }
    }

结果如下:

每个节点对祖级列表的编号List赋值
	@Test
    public void test01() {
        // 填充数据
        Node level4 = new Node(4, 3, "level4-01");
        Node level3 = new Node(3, 2, "level3-01");
        Node level2 = new Node(2, 1, "level2-01");
        Node level22 = new Node(22, 1, "level2-02");
        Node level1 = new Node(1, 0, "level1-01");
        List level3children = new ArrayList<>();
        level3children.add(level4);
        level3.setChildren(level3children);
        List level2children = new ArrayList<>();
        level2children.add(level3);
        level2.setChildren(level2children);
        List children = new ArrayList<>();
        children.add(level2);
        children.add(level22);
        level1.setChildren(children);
        System.out.println(level1.toString());
        System.out.println("===============before===============");
        // 树形转为list
        List result = new ArrayList<>();
        this.recursionTreeToList(result, level1, null);
        for (Node node : result) {
            node.setChildren(null);
            System.out.println(node.toString());
        }
        System.out.println("===============after===============");
        // 处理祖父列表
        this.handleAncestors(result);
        for (Node node : result) {
            System.out.println(node.toString());
        }
        System.out.println("===============handle ancestors after===============");
    }

    
    public void recursionTreeToList(List result, Node root, Node parentNode) {
        // 如果没有pid那么就赋值
       
        result.add(root);
        if (CollectionUtils.isEmpty(root.getChildren())) {
            return;
        }
        for (Node child : root.getChildren()) {
            this.recursionTreeToList(result, child, root);
        }
    }


    List ancestors = new ArrayList<>();

    
    public void handleAncestors(List list) {
        for (Node node : list) {
            ancestors = new ArrayList<>();
            List ancestorsList = this.recursionAncestors(list, node);
            ancestorsList.add(node.getId());
            node.setAncestors(ancestorsList);
        }
    }

    
    public List recursionAncestors(List list, Node n) {
        if (n.getId() == null) {
            return ancestors;
        }
        for (Node node : list) {
            if (n.getPId() == node.getId()) {
                this.recursionAncestors(list, node);
                ancestors.add(node.getId());
            }
        }
        return ancestors;
    }

结果如下:

list转为树形
 	@Test
    public void test01() {
        // 填充数据
        Node level4 = new Node(4, 3, "level4-01");
        Node level3 = new Node(3, 2, "level3-01");
        Node level2 = new Node(2, 1, "level2-01");
        Node level22 = new Node(22, 1, "level2-02");
        Node level1 = new Node(1, 0, "level1-01");
        List level3children = new ArrayList<>();
        level3children.add(level4);
        level3.setChildren(level3children);
        List level2children = new ArrayList<>();
        level2children.add(level3);
        level2.setChildren(level2children);
        List children = new ArrayList<>();
        children.add(level2);
        children.add(level22);
        level1.setChildren(children);
        System.out.println(level1.toString());
        System.out.println("=============== before Tree To List ===============");
        List result = new ArrayList<>();
        // 树形转为list
        this.recursionTreeToList(result, level1, null);
        for (Node node : result) {
            node.setChildren(null);
            System.out.println(node.toString());
        }
        System.out.println("=============== after Tree To List ===============");
        // 处理祖父列表
        this.handleAncestors(result);
        for (Node node : result) {
            System.out.println(node.toString());
        }
        System.out.println("===============handle ancestors after===============");
        List nodes = this.recursionListToTree(result, 0);
        for (Node node : nodes) {
            System.out.println(node.toString());
        }
        System.out.println("=============== after List To Tree ===============");
    }

    
    public void recursionTreeToList(List result, Node root, Node parentNode) {
        // 如果没有pid那么就赋值
       
        result.add(root);
        if (CollectionUtils.isEmpty(root.getChildren())) {
            return;
        }
        for (Node child : root.getChildren()) {
            this.recursionTreeToList(result, child, root);
        }
    }

    
    public List recursionListToTree(List list, int pId) {
        List nodes = new ArrayList<>();
        for (Node node : list) {
            // 找出父节点
            if (pId == node.getPId()) {
                // 调用递归方法填充子节点列表
                nodes.add(this.findChildren(node, list));
            }
        }
        return nodes;
    }

    
    public Node findChildren(Node tree, List treeList) {
        for (Node node : treeList) {
            if (tree.getId().equals(node.getPId())) {
                if (CollectionUtils.isEmpty(tree.getChildren())) {
                    tree.setChildren(new ArrayList<>());
                }
                // 递归 调用自身
                tree.getChildren().add(this.findChildren(node, treeList));
            }
        }
        return tree;
    }

    List ancestors = new ArrayList<>();

    
    public void handleAncestors(List list) {
        for (Node node : list) {
            ancestors = new ArrayList<>();
            List ancestorsList = this.recursionAncestors(list, node);
            ancestorsList.add(node.getId());
            node.setAncestors(ancestorsList);
        }
    }

    
    public List recursionAncestors(List list, Node n) {
        if (n.getId() == null) {
            return ancestors;
        }
        for (Node node : list) {
            if (n.getPId() == node.getId()) {
                this.recursionAncestors(list, node);
                ancestors.add(node.getId());
            }
        }
        return ancestors;
    }

结果如图:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1031996.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号