位置: IT常识 - 正文

向下递归以及向上递归(递归是从底向上逐层计算的)

编辑:rootadmin
###结果以json格式输出,可以用json在线解析,方便查看 package com.xintone.demo; import cn.hutool.json.JSONUtil; import lombok.Data; import org.springframework.util.Collecti ... 结果以json格式输出,可以用json在线解析,方便查看package com.xintone.demo;import cn.hutool.json.JSONUtil;import lombok.Data;import org.springframework.util.CollectionUtils;import java.util.ArrayList;import java.util.List;import java.util.stream.Collectors;@Datapublic class Recursion { // 主键id private Integer id; // 父级id private Integer parentId; // 子集 private List<Recursion> children; // 层级 private Integer level; public Recursion(Integer id, Integer parentId) { this.id = id; this.parentId = parentId; } public static void main(String[] args) { // 获取测试数据 List<Recursion> recursions1 = getList(); // 获取顶级父集 List<Recursion> parents = recursions1.stream().filter(item -> item.getParentId().equals(0)).collect(Collectors.toList()); // 设置层级 parents.forEach(item -> item.setLevel(0)); // 向下递归 downwardRecursion(parents, recursions1); System.out.println("向下递归:" + JSONUtil.toJsonStr(parents)); System.out.println("-------------分割线-------------"); // 获取测试数据 List<Recursion> recursions2 = getList(); // 获取测试数据中所有的 parentId List<Integer> parentIds = recursions2.stream().map(Recursion::getParentId).collect(Collectors.toList()); // 判断 id 是否在 parentIds 中,不在则是最子级 List<Recursion> children = recursions2.stream().filter(item -> !parentIds.contains(item.getId())).collect(Collectors.toList()); // 向上递归 upwardRecursion(children, recursions2); // 递归完从测试数据中筛选出最顶级 List<Recursion> tree = recursions2.stream().filter(item -> item.getParentId().equals(0)).collect(Collectors.toList()); System.out.println("向上递归:" + JSONUtil.toJsonStr(tree)); } private static void upwardRecursion(List<Recursion> children, List<Recursion> all) { // 遍历子集 children.forEach(child -> { // 获取该子级的父级 Recursion parent = all.stream().filter(item -> child.getParentId().equals(item.getId())).findFirst().orElse(null); // 判断父级是否为空,如果为空则是最顶级 if (parent != null) { // 判断父级的子集是否为空 if (parent.getChildren() == null) { // 新建一个集合将子级添加到父级的子集中 parent.setChildren(new ArrayList<Recursion>() {{ add(child); }}); // 判断该子级是否在父级的子集中存在 // 因为在遍历子级时,会出现多个子级的父级相同,如果不加判断会导致数据重复 } else if (!parent.getChildren().contains(child)) { // 将该子级添加到父级的子集中 parent.getChildren().add(child); } // 将父级添加到集合并向上递归 upwardRecursion(new ArrayList<Recursion>() {{ add(parent); }}, all); child.setLevel(parent.getLevel() + 1); } else { child.setLevel(0); } }); } private static void downwardRecursion(List<Recursion> parents, List<Recursion> all) { // 遍历父集 parents.forEach(recursion -> { // 获取该父级的子集 List<Recursion> children = all.stream().filter(item -> item.getParentId().equals(recursion.getId())).collect(Collectors.toList()); // 判断子集是否为空 if (!CollectionUtils.isEmpty(children)) { // 设置子集的层级 children.forEach(item -> item.setLevel(recursion.getLevel() + 1)); // 将子集添加到该父级的子集去 recursion.setChildren(children); // 向下递归 downwardRecursion(children, all); } }); } private static List<Recursion> getList() { List<Recursion> list = new ArrayList<>(); list.add(new Recursion(1, 0)); list.add(new Recursion(2, 0)); list.add(new Recursion(3, 0)); list.add(new Recursion(4, 1)); list.add(new Recursion(5, 1)); list.add(new Recursion(6, 2)); list.add(new Recursion(7, 2)); list.add(new Recursion(8, 3)); list.add(new Recursion(9, 3)); list.add(new Recursion(10, 4)); list.add(new Recursion(11, 4)); list.add(new Recursion(12, 5)); list.add(new Recursion(13, 5)); list.add(new Recursion(14, 6)); list.add(new Recursion(15, 6)); list.add(new Recursion(16, 7)); list.add(new Recursion(17, 7)); list.add(new Recursion(18, 8)); list.add(new Recursion(19, 8)); list.add(new Recursion(20, 9)); list.add(new Recursion(21, 9)); return list; }}
本文链接地址:https://www.jiuchutong.com/zhishi/310476.html 转载请保留说明!

上一篇:python __init__()的使用注意(python里面init)

下一篇:python中如何使用np.delete()方法?(python有什么用)

  • 关于微信营销:你不得不知的的8条实战秘笈(关于微信营销的论文)

    关于微信营销:你不得不知的的8条实战秘笈(关于微信营销的论文)

  • 苹果13面部解锁后怎么直接进入桌面(苹果13面部解锁怎么设置)

    苹果13面部解锁后怎么直接进入桌面(苹果13面部解锁怎么设置)

  • 电脑上怎么登录qq(电脑上怎么登录2个微信)

    电脑上怎么登录qq(电脑上怎么登录2个微信)

  • qq有没有必要安装flash(qq有没有必要安装flash插件)

    qq有没有必要安装flash(qq有没有必要安装flash插件)

  • 视频聊天美颜怎么打开(视频聊天美颜怎样设计的)

    视频聊天美颜怎么打开(视频聊天美颜怎样设计的)

  • 快手什么时候上市(快手什么时候上热门)

    快手什么时候上市(快手什么时候上热门)

  • lumion复制快捷键(lumion的复制是什么键)

    lumion复制快捷键(lumion的复制是什么键)

  • 苹果11黑屏转圈圈怎么办(苹果11黑屏转圈重启不了)

    苹果11黑屏转圈圈怎么办(苹果11黑屏转圈重启不了)

  • 微信加多少人会显示操作频繁(微信加多少人会限制)

    微信加多少人会显示操作频繁(微信加多少人会限制)

  • 头条关注和粉丝的区别(头条关注粉丝数据存储结构)

    头条关注和粉丝的区别(头条关注粉丝数据存储结构)

  • 闲鱼的曝光是什么(闲鱼里的曝光是什么意思?)

    闲鱼的曝光是什么(闲鱼里的曝光是什么意思?)

  • qq隐藏会话还能收到消息吗(qq隐藏会话还能发红包吗)

    qq隐藏会话还能收到消息吗(qq隐藏会话还能发红包吗)

  • 显示器显示节电模式是怎么回事(显示器显示节电模式是什么情况)

    显示器显示节电模式是怎么回事(显示器显示节电模式是什么情况)

  • 多媒体具有什么特性(多媒体具有什么并茂的强大优势)

    多媒体具有什么特性(多媒体具有什么并茂的强大优势)

  • 幻灯片比例怎么调整(幻灯片比例怎么设置16:9)

    幻灯片比例怎么调整(幻灯片比例怎么设置16:9)

  • 如何删除word2010占位符(如何删除Word水印)

    如何删除word2010占位符(如何删除Word水印)

  • 微信收款能直接到银行卡吗(微信收款能直接到银行卡里吗)

    微信收款能直接到银行卡吗(微信收款能直接到银行卡里吗)

  • 如何设置淘宝支付方式(如何设置淘宝支付扣款顺序)

    如何设置淘宝支付方式(如何设置淘宝支付扣款顺序)

  • 计算器上on叫做什么键(计算器上on叫做什么)

    计算器上on叫做什么键(计算器上on叫做什么)

  • 笔记本wifi万能钥匙怎么用(笔记本wifi万能钥匙哪个好用)

    笔记本wifi万能钥匙怎么用(笔记本wifi万能钥匙哪个好用)

  • 电信查本机号码是多少(电信查本机号码怎么查)

    电信查本机号码是多少(电信查本机号码怎么查)

  • win10电源管理在哪里(win10电源管理器在哪)

    win10电源管理在哪里(win10电源管理器在哪)

  • [JSOI2010]连通数(连通函数)

    [JSOI2010]连通数(连通函数)

  • 税务罚款如何做会计分录
  • 生产车间领用材料,用于产品生产
  • 总承包单位可以分包吗
  • 预缴增值税 进项税扣除
  • 年初未分配利润和年末未分配利润的关系
  • 在公司交社保不满十年,女性按照什么退税
  • 技术转让所得的税收优惠
  • 应收账款未收到是否要交税
  • 母子公司无偿划拨资产
  • 企业计提福利费时,贷记应付职工薪酬
  • 小微企业减半征收城建税
  • 客户已经抵扣的发票怎么开负数发票给对方
  • 投资收益率中投资总额包括哪些
  • 个人独资企业个税税率表2023
  • 开一张增值税发票需要交哪些税
  • 营改增后工业企业税率是多少?
  • 增值税普票丢失发票联能重开吗
  • 开票代码在哪里看
  • 发票开了款没付
  • 公司内部银行往来款会计分录
  • 从对公账户转账到个人账号需要多久?
  • 修改hosts文件的软件
  • 默认网关为什么有两个
  • linux架构师是做什么的
  • 应付票据可以直接填列吗
  • 建筑企业安装费计入什么科目
  • 企业缴纳保险的比例
  • 个人销售废旧物资如何开票
  • 劳务报酬已扣税是否需报个税
  • 原材料当废品卖出分录
  • 投资性房地产公允价值大于账面价值计入
  • 有利润但不交企业所得税
  • 麻雀优化算法和鲸鱼算法哪个好
  • php接口开发详解
  • yum命令详解
  • jsp页面构成
  • 物流公司挂靠车辆怎么做账
  • 小规模纳税人开专票需要交税吗
  • 合同 成本
  • 公司注销税款太多
  • 递延所得税资产和递延所得税负债
  • 公司基本户如何注销
  • linux mysql 安装与操作
  • 以前年度费用退回
  • 业务招待费如何调整
  • 交易性金融资产的账务处理
  • 增值税申报开具其他发票包含哪些
  • 以前年度账务错误应该怎么处理的
  • 财务软件服务费合同印花税
  • 公司购买电视属于什么费用
  • 企业开办费计入什么科目
  • 个人到税务局开普票要交多少税
  • 内部交易固定资产折旧为什么调整
  • jdbc连接mysql数据库步骤
  • sql 普通行列转换
  • mysql数据监控
  • window mysql
  • vnc server apk
  • xmpdisabled什么意思
  • win7盘符不见了
  • Windows tips小技巧
  • win7电脑连不上wifi怎么办
  • win10如何删除pin登录密码
  • windows7版本支持功能最少的
  • 双液浆常用配合比
  • win7能装coreldraw2020吗
  • win10系统如何在管理页面设置共享
  • opengl 投影矩阵
  • preorder遍历
  • linux每隔1s执行一次命令
  • python代码50行
  • js不重复集合
  • 缓动函数网站
  • ubuntu nodejs
  • angular.js
  • shell脚本语句
  • python字典合并 同key
  • android 自定义linearlayout 宽度计算不对
  • js解析json字符串获取key
  • 荆州市物业管理
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设