java递归生成无限层级的树--分类管理

首先需要父子关系,帖代码

package com.zhizhuo.zcms.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
 * @author zhizhuo-1543057945
 * @since 2019-08-14
 */
@Data
@Accessors(chain = true)
public class Category implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 分类id
     */
    @TableId(value = "cate_id", type = IdType.AUTO)
    private Integer cateId;
    /**
     * 分类名
     */
    private String cateName;
    /**
     * 英文名
     */
    private String cateEn;
    /**
     * 分类添加时间
     */
    private LocalDateTime cateAddTime;
    /**
     * 分类修改时间
     */
    private LocalDateTime cateUpdateTime;
    /**
     * 父id
     */
    private Integer catePid;
    /**
     * 分类排序
     */
    private Integer cateSort;

    /**
     * 分类状态,0开启,1关闭,2为已删除
     */
    private Integer cateStatus;
    /**
     * 分类下的标题-网站标题
     */
    private String cateTitle;
    /**
     * 分类下的网站关键词
     */
    private String cateKey;
    /**
     * 分类下的网站描述
     */
    private String cateDes;
}

接下来我们创建一个树结构treeUtil

package com.zhizhuo.zcms.utils;
import lombok.*;
import java.util.List;

/**
 * 〈一句话功能简述〉<br> 
 * 生成树
 * @author 1543057945
 * @create 2019/8/17
 * @since 1.0.0
 */
@Data
@ToString
@Builder(toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class TreeUtil<T> {
    /**
     * 当前节点
     */
    private T currNode;
    /**
     * 孩子
     */
    private List<TreeUtil<T>> childs;
}

说一下currNode他是当前节点,因为他是泛型定义,需要我们传入对象类型才可以,应该会想到是上面那个category类,没错就是的,childs只是个TreeUtil的集合,因为currNode节点下不止一个呢,所以要定义集合,可能会问为什么不是category的集合,如果是的话就会出现问题,

接下来看,我们实际操作
在项目中我做了排序,贴上排序代码,使用lambda表达式写的,应该看得懂

 /**
     * 排序
     * @return
     */
    private Comparator<TreeUtil<Category>> sort(){
        return  (o, o1)->o.getCurrNode().getCateSort()-o1.getCurrNode().getCateSort();
    }

先说下真正的需求,我要得到指定分类id下面的全部集合,也就是动态树
那么我们需要传入一个id

 /**
     * 生成树
     * @return
     */
    @Override
    public List<TreeUtil<Category>> getCateTreeById(Integer id) {
        //先得到所有的节点
        List<Category> categoryList = selectAll();
        //把查询到的变成树
        ArrayList<TreeUtil<Category>> treeUtils = new ArrayList<>();
        //排序
        Collections.sort(treeUtils,sort());
        for (Category category1 : categoryList) {
            treeUtils.add(new TreeUtil<Category>().toBuilder().currNode(category1).build());
        }
        //返回该结果的所有树
        return getChild(treeUtils, id);
    }

核心递归代码

/**
     *
     * @param treeUtilList
     * @param id
     * @return
     */
    @SuppressWarnings("ALL")
    private List<TreeUtil<Category>> getChild(List<TreeUtil<Category>> treeUtilList, Integer id) {
        //装入子树
        ArrayList<TreeUtil<Category>> childs = new ArrayList<>();
        //查找id的子树
        for (TreeUtil<Category> treeUtil : treeUtilList) {
            if (treeUtil.getCurrNode().getCatePid().equals(id)){
                childs.add(treeUtil);
            }
        }
        //排序
        Collections.sort(childs,sort());
        //遍历子树,并查找下一级子树
        for (TreeUtil<Category> child : childs) {
            child.setChilds(getChild(treeUtilList,child.getCurrNode().getCateId()));
        }
        /*//结束条件
        if (childs.size()==0){
            return new ArrayList<>();
        }*/
        return childs;
    }

这样我们就得到了树,顺便贴一张图
在这里插入图片描述

发布了34 篇原创文章 · 获赞 6 · 访问量 3654

猜你喜欢

转载自blog.csdn.net/qq_35986709/article/details/99699161