递归方法学习

该代码段展示了如何从数据库查询所有的SysOldOrgNew记录,并通过递归方式构建树形数据结构。首先,从mapper获取所有记录,然后遍历并创建对应的Dto对象,设置其属性。接着,筛选出根节点(parent_id为2),并按id排序。通过递归函数getChild,为每个根节点添加子节点,同时对子节点列表进行排序。最终返回包含所有根节点的列表,每个根节点包含了完整的子树。
摘要由CSDN通过智能技术生成
public List<SysOldOrgNewDto> getAll() {
    //查询所有的记录
    List<SysOldOrgNew> sysOldOrgNewList = sysOldOrgNewMapper.selectList(null);
    List<SysOldOrgNewDto> sysOldOrgNewDtoList = new ArrayList<>();
    for (SysOldOrgNew sysOldOrgNew : sysOldOrgNewList) {
        SysOldOrgNewDto sysOldOrgNewDto = new SysOldOrgNewDto();
        sysOldOrgNewDto.setId(sysOldOrgNew.getId());
        sysOldOrgNewDto.setParentId(sysOldOrgNew.getParentId());
        sysOldOrgNewDto.setName(sysOldOrgNew.getName());
        sysOldOrgNewDto.setOldName(sysOldOrgNew.getOldName());
        sysOldOrgNewDto.setCode(sysOldOrgNew.getCode());
        sysOldOrgNewDto.setParentCode(sysOldOrgNew.getParentCode());
        sysOldOrgNewDtoList.add(sysOldOrgNewDto);
    }

    //查询所有的根节点
    List<SysOldOrgNewDto> sysOldOrgNewDtoRootList = new ArrayList<>();
    for (SysOldOrgNewDto sysOldOrgNewDto : sysOldOrgNewDtoList) {
        if (2 == sysOldOrgNewDto.getParentId()) {//父节点是2的,为根节点。
            sysOldOrgNewDtoRootList.add(sysOldOrgNewDto);
        }
    }

    //排序,根据主键id排序
    sysOldOrgNewDtoList.sort(Comparator.comparingInt(SysOldOrgNewDto::getId));
    //给根节点添加子节点,用到递归调用getChild
    for (SysOldOrgNewDto sysOldOrgNewDtoRoot : sysOldOrgNewDtoRootList) {
        List<SysOldOrgNewDto> childList = getChild(sysOldOrgNewDtoRoot.getId(), sysOldOrgNewDtoList);
        sysOldOrgNewDtoRoot.setSysOldOrgNewDtoList(childList);
    }
    return sysOldOrgNewDtoRootList;//最后返回的是根节点集合,所有数据递归遍历后全set到里边了
}

/**
 * 获取子节点
 *
 * @param id  每个节点的id(和所有数据列表中的父节点做比较)
 * @param sysOldOrgNewDtoList 所有的列表集合
 * @return 每个根节点下,所有子节点列表
 */
private List<SysOldOrgNewDto> getChild(Integer id, List<SysOldOrgNewDto> sysOldOrgNewDtoList) {
    List<SysOldOrgNewDto> childList = new ArrayList<>();
    for (SysOldOrgNewDto sysOldOrgNewDto : sysOldOrgNewDtoList) {
        if (id.equals(sysOldOrgNewDto.getParentId())) {
            childList.add(sysOldOrgNewDto);
        }
    }
    //递归查询
    for (SysOldOrgNewDto sysOldOrgNewDto : childList) {
        sysOldOrgNewDto.setSysOldOrgNewDtoList(getChild(sysOldOrgNewDto.getId(), sysOldOrgNewDtoList));//注意这个地方,要用sysOldOrgNewDtoList这个集合
    }
    //排序
    childList.sort(Comparator.comparing(SysOldOrgNewDto::getId));
    //如果节点下没有子节点,返回一个空list(递归退出)
    if (childList.size() == 0) {
        return new ArrayList<>();
    }

    return childList;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值