Java快速实现多级菜单递归数据处理

最近在优化项目,想要针对已有的后台管理目录做一个整体管理,在返回数据时,对如何嵌套有些发愁,简单想了以下方法实现

数据库表 (B)

字段 含义
id 主键(自增)
fid 父级菜单id
name 菜单名字
url 跳转页面
order 同级目录的排序

代码GOGOGO

创建实体类

public class B{
    private Integer id;
    private Integer fid;
    private String name;
    private String url;
    private Integer order;
    private List<B> bList;

    public B(Integer id, Integer fid, String name, String url, Integer order) {
        this.id = id;
        this.fid = fid;
        this.name = name;
        this.url = url;
        this.order = order;
    }
	/**
	* 此处省略@getter@setter方法
	*/
	/**
	* 自定义打印方法
	*/
	public void ssout(Integer index) {
        String t = "";
        for(int i=0;i<index;i++){
            t+="\t";
        }
        System.out.println("B{" +
                "id=" + id +
                ", fid=" + fid +
                ", name='" + name + '\'' +
                ", url='" + url + '\'' +
                ", order=" + order +
                '}');
        if(bList!=null){
            for(B b1:bList){
                System.out.print(t);
                b1.ssout(index+1);
            }
        }
    }
}

创建假数据方法
运算开始

public static void main(String[] args) {
  List<B> data = getData()
           .stream()
           .sorted((b1, b2) -> b1.getOrder()
                   .compareTo(b2.getOrder()))
           .collect(Collectors.toList());
   //获取总的跟节点
   List<B> nav = data.stream()
           .filter(b -> b.getFid()==null||b.getFid().equals(""))
           .collect(Collectors.toList());
   //除了总结点的节点
   List<B> lang =  data.stream()
           .filter(b -> b.getFid()!=null&&!b.getFid().equals(""))
           .collect(Collectors.toList());
   for(B b:nav){setB(b,lang);}
   for(B b1:nav){b1.ssout(1);}
}
/**
* 递归赋值
*/
public static void setB(B b,List<B> bList){
   List<B> bb = new ArrayList<>();
   int size = bList.size();
   for(int i=0;i<size;i++){
       if(b.getId()==bList.get(i).getFid()){
           bb.add(bList.remove(i));//从原数组拿出已匹配的数据放入新的List
           size--;i--;
       }
   }
   for(int j=0;j<bb.size();j++){
       setB(bb.get(j),bList);
   }
   b.setbList(bb);
}
/**
* 创建假数据
*/
public static List<B> getData(){
    ArrayList<B> bArrayList  = new ArrayList<>();
    bArrayList.add(new B(2,4,"1-1","www",1));
    bArrayList.add(new B(4,null,"1","www",1));
    bArrayList.add(new B(3,1,"2-1","www",1));
    bArrayList.add(new B(5,4,"1-3","www",3));
    bArrayList.add(new B(9,4,"1-2","www",2));
    bArrayList.add(new B(7,3,"2-1-1","www",1));
    bArrayList.add(new B(6,9,"1-2-1","www",1));
    bArrayList.add(new B(10,1,"2-2","www",2));
    bArrayList.add(new B(1,null,"2","www",2));
    bArrayList.add(new B(8,3,"2-1-2","www",2));
    return bArrayList;
}

运行结果截图
在这里插入图片描述

总结

总的来看,其实每一个子栏目只能对应一个父类,所以思路为:

  1. 获得总数据(L
  2. 确定 根父亲(A),从L中删除A
  3. 查找父亲是A的所有孩子,储存为 变量(B),从L中删除B中存在的数据
  4. 循环B,把变量B中的每一个值(b)当做新的父亲,同L在此传入方法做递归处理
  5. 当确认L中无数据时表示已经分配完毕,从后往前开始装载
    例: D是EF的父亲,E是GK的父亲,
    流程图

猜你喜欢

转载自blog.csdn.net/flaystar/article/details/106257226