菜单一般有很多级,然后数据库一般都是存的 自己的id,父id,名字
这个时候想转化成菜单树的格式就需要自己编写代码实现了。
1.获取所有的菜单元素
2.遍历所有的菜单元素,找到一级菜单元素( pid 为null的就是一级菜单 )
3.递归查找子菜单,用一级菜单的 id 去匹配所有的菜单元素,如果 其他的菜单元素的 pid 为 一级菜单的 id,则证明该菜单是一级菜单的子元素,然后重复此步骤,知道 找不到子元素,则该这一个支结束
==>代码实现:
Element 菜单元素里面添加 List<Element> childs; 子菜单,用来装子菜单
import java.util.List;
public class Element {
private String id;
private String pid;
private String name;
private List<Element> childs;
....省略 getset
}
GetTree类
思路我已经说了,看代码的时候注意看注释
import java.util.ArrayList;
import java.util.List;
public class GetTree {
// 菜单节点s
private static List<Element> list = new ArrayList<>();
static {
list.add( new Element("1",null,"执法考评") );
list.add( new Element("2","1","日常考评") );
list.add( new Element("5","1","行政考评") );
list.add( new Element("4","2","警情考评") );
list.add( new Element("6","4","刑事考评") );
list.add( new Element("3","1","抽案考评") );
list.add( new Element("7",null,"一级菜单") );
}
public List<Element> getTree() {
List<Element> baseLists = new ArrayList<>();
// 总菜单,出一级菜单,一级菜单没有父id
for (Element e: list) {
if( e.getPid()==null ){
baseLists.add( e );
}
}
// 遍历一级菜单
for (Element e: baseLists) {
// 将子元素 set进一级菜单里面
e.setChilds( getChild(e.getId(),list) );
}
return baseLists;
}
/**
* 获取子节点
* @param pid
* @param elements
* @return
*/
private List<Element> getChild(String pid , List<Element> elements){
List<Element> childs = new ArrayList<>();
for (Element e: elements) {
if(e.getPid()!=null){
if(e.getPid().equals( pid )){
// 子菜单的下级菜单
childs.add( e );
}
}
}
// 把子菜单的子菜单再循环一遍
for (Element e: childs) {
// 继续添加子元素
e.setChilds( getChild( e.getId() , elements ) );
}
//停下来的条件,如果 没有子元素了,则停下来
if( childs.size()==0 ){
return null;
}
return childs;
}
}