概述
很多人见过菜单导航之类的东西吧,还有分类什么的。就是一级数据下面有二级三级甚至更多,这种数据就需要用到这个树形结构了。
代码实现
废话不多说。先创建菜单的实体类吧
我是直接用的实体类里面的 main方法 写了个静态代码块用来模拟数据的。 数据库建模和这个差不多就行。
下面上方法
public class NavTree {
// 创建一个静态的集合用来模拟从数据库中取出的数据
private static List<NavTree> list = new ArrayList<>();
// 主键ID
private Long id;
// 名称
private String name;
// 父级ID
private Long parentId;
// 用来保存这个树中的树杈
private List<NavTree> trees = new ArrayList<>();
public List<NavTree> getTrees() {
return trees;
}
public void setTrees(List<NavTree> trees) {
this.trees = trees;
}
public NavTree() {
}
public NavTree(Long id, String name, Long parentId) {
this.id = id;
this.name = name;
this.parentId = parentId;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getParentId() {
return parentId;
}
public void setParentId(Long parentId) {
this.parentId = parentId;
}
@Override
public String toString() {
return "NavTree{" +
"id=" + id +
", name='" + name + '\'' +
", parentId=" + parentId +
", trees=" + trees +
'}';
}
// 静态代码块,用来初始化数据
static {
list.add(new NavTree(1L,"aa",0L));
list.add(new NavTree(2L,"bb",0L));
list.add(new NavTree(3L,"cc",0L));
list.add(new NavTree(33L,"dd",1L));
list.add(new NavTree(44L,"ee",1L));
list.add(new NavTree(55L,"ff",2L));
list.add(new NavTree(66L,"gg",2L));
list.add(new NavTree(77L,"qq",3L));
list.add(new NavTree(88L,"tt",33L));
list.add(new NavTree(99L,"zz",33L));
}
// 递归函数 用来创建树形结构
public static NavTree getTree( NavTree tree,List<NavTree> trees2){
// 创建一个集合给实体类添加树杈
ArrayList<NavTree> trees = new ArrayList<>();
// 循环遍历传进来的集合。
for (NavTree t:trees2 ) {
// 通过ID判断是否拥有子菜单
if (tree.getId() == t.getParentId()){
// 并且递归到下一个函数中查看是否还存在子集
getTree(t,trees2);
// 如果拥有 就添加到集合中
trees.add(t);
}
}
// 如果不存在给出一个出口。返回
tree.setTrees(trees);
return tree;
}