java 后端实现树形数据结构

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

例如:在项目中我们时常会有需求做树形菜单的需求


提示:以下是本篇文章正文内容,下面案例可供参考

一、树形结构数据是什么?

就是如图所示在这里插入图片描述

二、使用步骤

1.创建实体类

树形结构一定要有子集结合 一般名为children 还要有一个上级id

@Data
public class PartnersListVo {

    /** 合作伙伴Id */
    private Long id;
    /** 合作伙伴上级id */
    private Long partnerId;
    /** 合作伙伴名称 */
    private String partnersName;
    /** 分润金额 */
    private BigDecimal allotAmount;
    /** 已提现金额 */
    private BigDecimal withdrawAmount;
    /** 可提现金额 */
    private BigDecimal canWithdrawAmount;
    /*子集*/
    private List<PartnersListVo> children=new ArrayList<>();;

    public void addChild(PartnersListVo child) {
        this.children.add(child);
    }

    public PartnersListVo() {
    }

    public PartnersListVo(Long id, Long partnerId, String partnersName, BigDecimal allotAmount, BigDecimal withdrawAmount, BigDecimal canWithdrawAmount, List<PartnersListVo> children) {
        this.id = id;
        this.partnerId = partnerId;
        this.partnersName = partnersName;
        this.allotAmount = allotAmount;
        this.withdrawAmount = withdrawAmount;
        this.canWithdrawAmount = canWithdrawAmount;
        this.children =  new ArrayList<>();
    }

}

2使用方法

   /**
     * 获取合作伙伴列表
     * @author LeiFengLiang
     * @createTime  2023/5/30 10:53 
     * @Param [partnersName]
     * @return java.util.List<com.xss.business.vo.PartnersListVo> 
     **/
    @Override
    public List<PartnersListVo>  getPartnersList(String partnersName) {
        List<PartnersListVo> list =baseMapper.getPartnersListVo(partnersName);
        if (partnersName!=null){
            return list;
        }
        return buildTree(list);
    }
    
    /*
     * 生成树形合作伙伴列表
     * @author LeiFengLiang
     * @createTime  2023/5/29 17:51 
     * @Param [partners]
     * @return java.util.List<com.xss.business.vo.PartnersListVo> 
     **/
    public List<PartnersListVo> buildTree(List<PartnersListVo> partners) {
        Map<Long, PartnersListVo> map = new HashMap<>();
        List<PartnersListVo> roots = new ArrayList<>();

        // 将所有合作伙伴存入map中
        for (PartnersListVo partner : partners) {
            map.put(partner.getId(), partner);
        }

        // 遍历所有合作伙伴,将其添加到其上级合作伙伴的children中
//        parentId.equals(17674168247L)
        for (PartnersListVo partner : partners) {
            Long parentId = partner.getPartnerId();
            if (parentId==null) {
                // 如果该合作伙伴没有上级合作伙伴,则将其作为根节点
                roots.add(partner);
            } else {
                PartnersListVo parent = map.get(parentId);
                if (parent != null) {
                    parent.getChildren().add(partner);
                }
            }
        }
        return roots;
    }

3.有时候有需求需要将树形结构 又变回普通集合结构 如:导出excel

 /**
     * 树形结构转化为普通集合数据 不影响原数据顺序
     * @author LeiFengLiang
     * @createTime  2023/5/31 16:30
     * @Param [treeList]
     * @return java.util.List<com.xss.business.vo.RecoveriesVo>
     **/
    private List<RecoveriesVo> convertToList(List<RecoveriesVo> treeList) {
        // 创建一个空的普通集合数据
        List<RecoveriesVo> list = new ArrayList<>();
        // 遍历树形结构数据
        for (RecoveriesVo node : treeList) {
            // 将当前节点添加到普通集合数据中
            list.add(node);
            // 如果当前节点有子节点 
            if (node.getChildren() != null && !node.getChildren().isEmpty()) {
            // 递归调用该方法,将子节点转化为普通集合数据,并添加到当前集合中
                list.addAll(convertToList(node.getChildren()));
            }
        }
        return list;
    }

总结

该博客仅单个人笔记使用 如能帮到各位在更好哈哈

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值