首先需要父子关系,帖代码
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;
}
这样我们就得到了树,顺便贴一张图