关于树形结构可参考我写的其他几篇文章:
1) 返回树形结构
何为递归?
递归函数即自调用函数,在函数体内直接或间接的调用自己。
递归的坏处:
非必须的时候,不要使用递归,对与比较父子节点比较深的节点也不建议使用递归,因为对于堆栈消耗比较大。
如何实现递归?
package com.test.test;
import com.test.vo.MenuVo;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* @Author tanghh
* @Date 2020/7/23 10:22
*/
public class MenuTest {
public static void main(String[]args){
List<MenuVo> voList = new ArrayList<>();
MenuVo vo1 = new MenuVo(1,0,"菜单1","one");
MenuVo vo2 = new MenuVo(2,1,"菜单2","two");
MenuVo vo3 = new MenuVo(3,2,"菜单2-2","two-two");
MenuVo vo4 = new MenuVo(4,1,"菜单3","three");
MenuVo vo5 = new MenuVo(5,4,"菜单3-3","three-three");
MenuVo vo6 = new MenuVo(6,0,"菜单4","four");
voList.add(vo1);
voList.add(vo2);
voList.add(vo3);
voList.add(vo4);
voList.add(vo5);
voList.add(vo6);
//递归父子节点树形关系
List<MenuVo> resultList = MenuTest.parseMenuTree(voList);
System.out.println(resultList);
}
/**
* @param list 数据库里面获取到的全量菜单列表
* @return
*/
public static List<MenuVo> parseMenuTree(List<MenuVo> list) {
List<MenuVo> result = new ArrayList<MenuVo>();
// 1、获取第一级节点
for (MenuVo content : list) {
if (0 == content.getParentId()) {
result.add(content);
}
}
// 2、递归获取子节点
for (MenuVo contentVo : result) {
recursiveMenuTree(contentVo,list);
}
return result;
}
/**
* 获取节点及其子节点返回对象
*
* @param parent
* @param list
* @return
*/
public static void recursiveMenuTree(MenuVo parent,List<MenuVo> list) {
List childList = new ArrayList();
for (MenuVo child : list) {
if (Objects.equals(parent.getId(), child.getParentId())) {
recursiveMenuTree(child,list);
childList.add(child);
parent.setChildren(childList);
}
}
}
}
效果图如下:
涉及的代码:
package com.test.vo;
import java.util.List;
/**
* @Author tanghh
* @Date 2020/7/23 10:18
*/
public class MenuVo {
private Integer id;
private Integer parentId;
private String name;
private String type;
private List children;
public MenuVo() {
}
public MenuVo(Integer id, Integer parentId, String name, String type) {
this.id = id;
this.parentId = parentId;
this.name = name;
this.type = type;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Integer getParentId() {
return parentId;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
public List getChildren() {
return children;
}
public void setChildren(List children) {
this.children = children;
}
}
小编技术还有待加强,大神勿喷,谢谢。