Java递归生成树形菜单结构

生成菜单如图所示
在这里插入图片描述

创建数据库
CREATE TABLE organization (organizationID VARCHAR(10),organizationName VARCHAR(10),parentID VARCHAR(10));
INSERT INTO organization VALUES('1' , 'school' , '0');
INSERT INTO organization VALUES('2.1' , 'grade1' , '1');
INSERT INTO organization VALUES('2.1.1' , 'class1' , '2.1');
INSERT INTO organization VALUES('2.2' , 'grade2' , '0');
INSERT INTO organization VALUES('2.3' , 'grade3' , '0');
INSERT INTO organization VALUES('2.1.2' , 'class2' , '2.1');
INSERT INTO organization VALUES('2.2.1' , 'class-1' , '2.2');
INSERT INTO organization VALUES('2.3.1' , 'class.1' , '2.3');
INSERT INTO organization VALUES('2.3.2' , 'cladd.2' , '2.3');

sql映射
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper>

    <!--列表查询-->
    <select id="sysOrgGetAll">
    SELECT
	organizationID,
	organizationName,
	parentID
    FROM
	sys_organization
	where state = 1
    </select>
</mapper>
创建实体类
/**
 *
 * 组织机构实体类
 *
 */
public class SysOrg {
    private String organizationID;  //主键
    private String organizationName;  //组织机构名称
    private String parentID;  //上层组织机构

    private List<SysOrg> children; //子集

定义mapper
@Mapper
public interface SysOrgMapper {
    //列表查询
    public List<SysOrg> sysOrgGetAll(SysOrg sysOrg);
}
控制层实现
public class SysOrgController extends BaseController{

    @Autowired
    private SysOrgService sysOrganization;

    /**
     * 列表查询
     */
     @PostMapping(value = "/getsysorg")
    public ResultRsp getSysOrg(SysOrg sysorg){
         return sysOrganization.getSysOrg(sysorg);
    }
}
定义service业务层实现
public ResultTRsp getSysOrg(SysOrg sysorg){
    //1.查出所有条目,放在一个集合sysAllOrgList中
    List<SysOrg> sysAllOrgList = sysOrgMapper.sysOrgGetAll(sysorg);
    //2. 在集合sysAllOrgList里面找出parentId是0的,放在一个集合2里
     //方法1 Lambda 表达式写法
     //List<SysOrg> getParentOryList = sysAllOrgList.stream().filter(a-> "0".equals(a.getParentID())).collect(Collectors.toList());
    //方法2 for循环方式
    List<SysOrg> getParentOryList = sysOrgGetParent(sysAllOrgList);
    //3. 把集合1和集合2传入方法
    List<SysOrg> res = getSysOrgChild(sysAllOrgList,getParentOryList);
}


public List<SysOrg> sysOrgGetParent(List<SysOrg> sysAllOrglist){
    List<SysOrg> parentList = new ArrayList<SysOrg>();
        for(int i = 0; i < sysAllOrglist.size(); i++) {
            if ("0".equals(sysAllOrglist.get(i).getParentID())) {
                parentList.add(sysAllOrglist.get(i));
            }
        }
        return parentList;
}

//递归查找子菜单
public List<SysOrg> getSysOrgChildren(List<SysOrg> sysOrgList, List<SysOrg> allParentList) {

        //1 循环最顶级组织机构
        for(int i = 0 ;i < allParentList.size() ; i++){
            //获取全部组织机构
            SysOrg sysParentOrg = allParentList.get(i);
            //保存子集
            List<SysOrg> childrenList = new ArrayList();
            //2 循环所有的组织机构
            for(int j = 0 ;j < sysOrgList.size() ; j++){
                //按顺序获取所有组织机构里面的数据
                SysOrg sysChildrenOrg = sysOrgList.get(j);
                //如果一级的ID是其他组织机构的父级ID的话,那么这条数据就是一级的子集
                if(sysParentOrg.getOrganizationID().equals(sysChildrenOrg.getParentID())){
                    childrenList.add(sysChildrenOrg);
                }
            }
            if(null != childrenList && childrenList.size() > 0){
                allParentList.get(i).setChidren(getSysOrgChildren(sysOrgList,childrenList));
            }
            allParentList.get(i).setChidren(childrenList);
            return allParentList;
        }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值