第一步我们先看下树的节点数据结构
public class MenuTree implements Serializable {
private String menuCode;
/**
* //菜单描述
*/
private String name;
/**
* //菜单图标
*/
private String icon;
/**
* //菜单指向的接口
*/
private String path;
/**
* //菜单的序号
*/
private Integer idx;
/**
* //菜单下的子菜单
*/
private List<MenuTree> children;
public void setIdx(Integer idx) {
this.idx = idx;
}
public Integer getIdx() {
return idx;
}
public void setMenuCode(String menuCode) {
this.menuCode = menuCode;
}
public String getMenuCode() {
return menuCode;
}
public String getName() {
return name;
}
public String getIcon() {
return icon;
}
public String getPath() {
return path;
}
public void setName(String name) {
this.name = name;
}
public void setIcon(String icon) {
this.icon = icon;
}
public void setPath(String path) {
this.path = path;
}
public void setChildren(List<MenuTree> children) {
this.children = children;
}
public List<MenuTree> getChildren() {
return children;
}
public void addChildren(MenuTree node){
this.children.add(node);
}
}
第二步我们建立一个生成节点的方法
这个方法不是必要的,主要用来将数据转换成标准节点结构
private MenuTree buildNode(Menu menu){
MenuTree node = new MenuTree();
node.setMenuCode(menu.getMenuCode());
node.setName(menu.getMeunName());
node.setIcon(menu.getMenuIcon());
node.setPath(menu.getMenuAddress());
node.setChildren(new ArrayList<>());
return node;
}
第三步我们建立一个获取根节点的方法
一般来说我们多是基于一个数组或者列表来生成树的,而树的根也会在这个列表中
private MenuTree getRoot(List<Menu> menus, String rootId) {
for (Iterator<Menu> it = menus.iterator(); it.hasNext(); ) {
Menu iterator = it.next();
if (iterator.getMenuCode().equals(rootId)) {
//取得根节点信息后,就把根节点信息从 列表中删除
menus.remove(iterator);
return buildNode(iterator);
}
}
return null;
}
第四步就是我们的创建树的方法了
方法很简单,基于 迭代器和递归
private MenuTree createMenuTree(List<Menu> menus, MenuTree parentNode) {
//此处判断是为了 防止传入一个 空的根节点造成访问根节点信息
//产生异常
if (null != parentNode) {
for (Iterator<Menu> it = menus.iterator(); it.hasNext(); ) {
Menu iterator = it.next();
if (parentNode.getMenuCode().equals(iterator.getParentCode())) {
//需要将此处符合的 信息从列表中删除,这样可以减少后来的 列表遍历次数
menus.remove(iterator);
MenuTree node = buildNode(iterator);
parentNode.addChildren(node);
//通过递归方式 在剩余的列表中 继续寻找子节点的 子节点
//递归返回的条件就是 在剩余的列表中没有 发现子节点
createMenuTree(menus, node);
//由于列表已改变需要 重新获取迭代器
it = menus.iterator();
}
}
}
return parentNode;
}
----------------------------------------------这就是底线了--------------------------------------------------