递归创建树形结构数据

2022-07-29 12:36:56

递归创建树形结构数据
创建一个树形结构对象,然后用递归算法,返回前端一个树形的list集合
1、先创建实体对象,树形结构必须要有关联的pid字段

@Data@AllArgsConstructor@NoArgsConstructorpublicclassNodeimplementsIBaseTree{/**
     * 主键id
     */privateInteger id;/**
     * 名称
     */privateString name;/**
     * 关联父id
     */privateInteger pid;/**
     * 关联子对象集合
     */privateList<Node> children=newArrayList<>();publicNode(Integer id,String name,Integer pid){this.id= id;this.name= name;this.pid= pid;}}

2、下面是转换数据的工具类:直接使用的是递归算法

publicclassTreeUtil{/**
     * 建树
     * @param list
     * @return
     */publicstaticList<Node>build(List<Node> list){List<Node> res=newArrayList<>();for(Node node: list){//如果是父节点,就查找下面所有字节点添加到子节点的集合中,也可以先把所有一级节点过滤出来遍历if(node.getPid()==0){buildChildren(node,list);
                res.add(node);}}return res;}/**
     *  递归查找一个节点下的所有子节点
     * @param node
     * @param list
     */publicstaticvoidbuildChildren(Node node,List<Node> list){//将所有的一级子节点查询出来List<Node> children= list.stream().filter(p->p.getPid().equals(node.getId())).collect(Collectors.toList());//如果一级子节点不为空,开始递归查找所有节点,直到子节点集合为空停止if(!CollectionUtils.isEmpty(children)){for(Node n: children){buildChildren(n,list);}
            node.setChildren(children);}}}

下面是单元测试:

@RunWith(SpringRunner.class)@SpringBootTestpublicclassServiceControllerTest{@Testpublicvoidtest01()throwsException{List<Node> nodes=newArrayList<>();
        nodes.add(newNode(1,"湖北",0));
        nodes.add(newNode(2,"湖南",0));
        nodes.add(newNode(3,"武汉",1));
        nodes.add(newNode(4,"武昌区",3));
        nodes.add(newNode(5,"黄冈",1));List<Node> list=TreeUtil.build(nodes);System.err.println(list);}}

上面这个是递归创建树形结构的基本思路和代码,但是不能当成工具类使用,下面是将整个建树的过程进行封装抽取成一套工具类的过程:
1、这个是抽取的返回的树形结构对象:基本结构是对象及下面的子对象集合,如果有多层就封装在children中

@DatapublicclassZtree<T>{privateT t;privateList<T> children;}

2、对实体的抽取和封装,BaseEntity可以用来抽取数据库建表是的必填字段(id,create_time,update_time,del),IBaseTree抽取的是针对的树形结构的数据,一般都是自关联的表,有pid字段的,Type 就是实体类,用来继承和实现需要的Base类/接口

@DatapublicabstractclassBaseEntity<E>implementsSerializable{@Id@JsonSerialize(using=ToStringSerializer.class)@GeneratedValue(generator="JDBC")privateE id;}publicinterfaceIBaseTree{voidsetPid(Integer pid);IntegergetPid();}@Data@AllArgsConstructor@NoArgsConstructorpublicclassTypeextendsBaseEntity<Integer>implementsIBaseTree{privateInteger pid;privateString name;}

3 、工具类的抽取

publicclassTreeUtil{/**
     * 
     * @param list  传入查询到的所有的list数据
     * @return  返回Ztree的list对象,已经转换成树形结构
     */publicstatic<TextendsBaseEntity&IBaseTree>List<Ztree>getTree(List<T> list){List<Ztree> res=newArrayList<>();List<T> collect= list.stream().filter(p-> p.getPid()==0).collect(Collectors.toList());for(T t: collect){Ztree ztree=newZtree();setZtree(t, list, ztree);
            res.add(ztree);}return res;}/**
     * @param t 
     * @param list  整个数据的list集合
     * @param ztree
     */privatestatic<TextendsBaseEntity&IBaseTree>voidsetZtree(T t,List<T> list,Ztree ztree){
        ztree.setT(t);
        ztree.setChildren(getChildrens(t, list));}/**
     * 
     * @param t
     * @param list  整个数据的list集合
     * @return
     */privatestatic<TextendsBaseEntity&IBaseTree>ListgetChildrens(T t,List<T> list){List res=newArrayList<>();for(T l: list){Ztree ztree=newZtree();if(Objects.equals(l.getPid(), t.getId())){setZtree(l, list, ztree);
                res.add(ztree);}}return res;}}

4、单元测试

@RunWith(SpringRunner.class)@SpringBootTestpublicclassServiceControllerTest{@Testpublicvoidtest01()throwsException{Type type1=newType(0,"湖北");
        type1.setId(1);Type type2=newType(0,"湖南");
        type2.setId(2);Type type3=newType(1,"武汉");
        type3.setId(3);Type type4=newType(1,"黄冈");
        type4.setId(4);Type type5=newType(2,"长沙");
        type5.setId(5);Type type6=newType(4,"黄梅");
        type6.setId(6);List<Type> list=Arrays.asList(type1,type2,type3,type4,type5,type6);List<Ztree> ztrees=TreeUtil.getTree(list);System.err.println(ztrees);}}
  • 作者:qiaoqiaoli11
  • 原文链接:https://blog.csdn.net/weiyifang11/article/details/109516712
    更新时间:2022-07-29 12:36:56