最近在优化项目,想要针对已有的后台管理目录做一个整体管理,在返回数据时,对如何嵌套有些发愁,简单想了以下方法实现
数据库表 (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;
}
运行结果截图
总结
总的来看,其实每一个子栏目只能对应一个父类,所以思路为:
- 获得总数据(
L
) - 确定 根父亲(
A
),从L
中删除A
- 查找父亲是
A
的所有孩子,储存为 变量(B
),从L
中删除B
中存在的数据 - 循环
B
,把变量B
中的每一个值(b
)当做新的父亲,同L
在此传入方法做递归处理 - 当确认
L
中无数据时表示已经分配完毕,从后往前开始装载
例: D是EF的父亲,E是GK的父亲,