JAVA实现树结构List递归遍历

前言

由于之前在写树结构遍历的时候都是 copy 的别人的代码,想着把功能完成就行,并没有真正理解如何实现的遍历的,又怎么递归。前几天尝试着自己写一个遍历树结构 List,其实很简单,所以能自己动手,决不要 copy。先记录一个查询,增、删、改后续补上。

正文
实现思路
1. 先从数据库根据相应条件获取出树结构 List
2. 遍历获取到的数据将根节点取出
3. 遍历刚取出的列表,调用递归方法将子节点数据存放到根节点里
4. 就是这么 easy,直接贴上代码,细品
/** 从一个简单的DTO文件开始 */
public class TestDTO {
    // 自身 ID
    private Long id;
    // 名称
    private String name;
    // 父节点 ID
    private Long parentId;
    // 子节点集合
    private List<TestDTO> children;
    // 其他属性
    ......
    // setter and getter 方法
    ......
}

/** 实现类 */
@Service
public class TestServiceImpl implements TestService {
    
    // Repository 当然是获取数据啦...
    private final TestRepository testRepository;
    
    // 这个是构造方法
    public TestServiceImpl(TestRepository testRepository) {
        this.testRepository = testRepository;
    }

    // 获取树结构数据
    public List<TestDTO> getList() {
        try {
            // 从数据库里获取 List 数据,如果有条件,则根据相应条件获取,总之这里是一个树结构的 list
            List<Test> tests = testRepository.findAll();
            // ??? 为什么不是 TestDTO 类型?这里 Test 是 Entity,从数据库获取的数据当前是用 Entity 类型接收啦!
            // 没关系的,可以转DTO
            // 定义一个空数组,用来存放最终的树结构数据
            List<TestDTO> result = new ArrayList<>();
            // 第一步遍历获取到的数据,将根节点数据存放 result 里
            for (Test test: tests) {
                // 判断是否是根节点,就是 parentId,这里是从 0 开始,如果 parentId 为 0 ,则表示根节点
                if (test.getParentId() == 0) {
                    // 这里可以将 entity 转为 DTO 存放
                    // 如果字段不多可以直接使用 set get 方法来存取,就像这样
                    TestDTO testDTO = new TestDTO();
                    testDTO.setId(test.getId);
                    testDTO.setName(test.getName);
                    testDTO.setParentId(test.getParentId);
                    // 如果字段太多,超过5个以上,还是建议使用 mapper 方法来转哦,具体如何使用 mapper 将 Entity 转为 DTO 请移步下方链接
                    result.add(testDTO);
                }
            }
            // 根节点添加完就需要添加每个节点的子节点了,这里需要调用 递归方法 getChildren();
            // 遍历根节点数据,为其设置子节点集合
            for (TestDTO test: result) {
                // 获取子节点数据,传入 当前节点 id 和 所有 list
                List<TestDTO> childList = getChildren(test.getId(), tests);
                // 将获取到的子节点集合添加到根节点里
                test.setChildren(childList);
            }
            // 将一层一层的树结构数据返回吧!
            return result;
        } catch(Exception e) {
            // 这里可以抛个异常
        }
    }
    
    /**
     * 获取子节点数据
     * @param id 父节点 ID
     * @param List<Test> tests 所有节点集合
     * @return 返回子节点列表
     */
    private List<TestDTO> getChildren(Long id, List<Test> tests) {
        // 存在子节点数据
        List<TestDTO> childList = new ArrayList<>();
        // 遍历所有节点数据
        for (Test item : tests) {
            // 如果当前节点 ID 与父节点 ID 一致,表示当前数据是该节点的子节点
            if (item.getParentId().equals(String.valueOf(id))) {
                TestDTO testDTO = new TestDTO();
                testDTO.setId(test.getId);
                testDTO.setName(test.getName);
                testDTO.setParentId(test.getParentId);
                // 如果字段太多,超过5个以上,还是建议使用 mapper 方法来转哦,具体如何使用 mapper 将 Entity 转为 DTO 请移步下方链接
                childList.add(testDTO);
            }
        }
        // 重点来了,递归调用
        for (TestDTO item : childList) {
            // 调用自身方法,依次添加子节点数据
            item.setChildren(getChildren(item.getId(), tests));
        }
        // 如果当前节点无子节点数据添加空数据,递归退出
        if (childList.size() == 0) {
            return new ArrayList<>();
        }
        // 返回最终的子节点数据
        return childList;
    }
    
    
}

链接:利用 mapper 方法将 Entity 转 DTO(以后再补上)

感谢您的阅读,有什么问题欢迎留言讨论🤪
在Vue中,可以使用递归组件来实现树结构遍历。在提供的引用中,引用和引用中的代码都展示了如何使用递归遍历树结构。通过递归遍历,我们可以遍历树的每个节点,并执行一些操作。在引用中的代码示例中,通过递归遍历树,将树中的数字类型的id转换为String类型。而在引用中的代码示例中,通过递归遍历树,找到指定id的节点,并将其checked属性设置为true。 在Vue中,可以创建一个递归组件,该组件在模板中调用自身来实现树的递归遍历。这使得我们可以在递归组件的模板中访问和操作每个节点的数据。在递归组件的代码中,我们可以使用v-for指令来遍历子节点,并对每个子节点进行递归调用。这样,我们就可以递归遍历整个树结构。 请注意,递归遍历树结构需要考虑递归的结束条件和递归调用的方式,以避免无限循环。通常情况下,我们可以通过判断节点是否有子节点来确定递归的结束条件。 因此,如果您想在Vue中实现递归遍历树结构的功能,可以参考引用和引用中的代码示例,并根据您的具体需求进行调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [递归遍历树结构数据(js,vue)](https://blog.csdn.net/weixin_45776308/article/details/128579753)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [利用Vue2.x开发实现JSON树的方法](https://download.csdn.net/download/weixin_38597990/14807803)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值