位置: 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有什么用)

  • 快手在别人手机登录怎么取消(快手在别人手机上登录怎么强制下线)

    快手在别人手机登录怎么取消(快手在别人手机上登录怎么强制下线)

  • 苹果最近通话记录只显示几天的(苹果最近通话记录删除了怎么找回来)

    苹果最近通话记录只显示几天的(苹果最近通话记录删除了怎么找回来)

  • 魅族18支持的4G网络有哪些(魅族18支持的有线耳机有哪些)

    魅族18支持的4G网络有哪些(魅族18支持的有线耳机有哪些)

  • 桌面角标权限是什么意思(桌面图标角标权限)

    桌面角标权限是什么意思(桌面图标角标权限)

  • 抖音本场点赞是什么(抖音本场点赞是收入吗)

    抖音本场点赞是什么(抖音本场点赞是收入吗)

  • 原装电池和非原装电池有什么区别(原装电池和非原装电池充电速度不一样)

    原装电池和非原装电池有什么区别(原装电池和非原装电池充电速度不一样)

  • win10系统还原是什么意思(win10还原系统设置会怎样)

    win10系统还原是什么意思(win10还原系统设置会怎样)

  • 笔记本最大内存多少(笔记本最大内存多少GB)

    笔记本最大内存多少(笔记本最大内存多少GB)

  • 微信身体传感器要开吗(微信身体传感器权限怎么开?)

    微信身体传感器要开吗(微信身体传感器权限怎么开?)

  • qq屏蔽此人和拉黑区别(qq屏蔽此人和拉黑去哪里能看到)

    qq屏蔽此人和拉黑区别(qq屏蔽此人和拉黑去哪里能看到)

  • 笔记本电脑摔了一下没事吧(笔记本电脑摔了一下屏幕出现条纹)

    笔记本电脑摔了一下没事吧(笔记本电脑摔了一下屏幕出现条纹)

  • 断电会使储存数据丢失的储存器是什么(断电会使储存数据减少吗)

    断电会使储存数据丢失的储存器是什么(断电会使储存数据减少吗)

  • 全开麦和半开麦是什么意思(怎么区分全开麦和半开麦)

    全开麦和半开麦是什么意思(怎么区分全开麦和半开麦)

  • 隐藏手机桌面图标软件(隐藏手机桌面图标怎么打开)

    隐藏手机桌面图标软件(隐藏手机桌面图标怎么打开)

  • vrv什么意思(vri是什么意思)

    vrv什么意思(vri是什么意思)

  • 怎样办微信二维收钱码(微信办二维码怎么办)

    怎样办微信二维收钱码(微信办二维码怎么办)

  • 苹果xr能用动态壁纸吗(苹果xr设置动态)

    苹果xr能用动态壁纸吗(苹果xr设置动态)

  • 红米k20pro长宽比例(红米k20pro机身尺寸长宽高)

    红米k20pro长宽比例(红米k20pro机身尺寸长宽高)

  • ags2-w09是什么型号(ags2-l09是什么型)

    ags2-w09是什么型号(ags2-l09是什么型)

  • realme手机中文名字(realme中文名字)

    realme手机中文名字(realme中文名字)

  • 笔记本电脑连接投影仪无信号(笔记本电脑连接打印机操作步骤)

    笔记本电脑连接投影仪无信号(笔记本电脑连接打印机操作步骤)

  • 为什么微信发视频没有显示(为什么微信发视频只能发30秒)

    为什么微信发视频没有显示(为什么微信发视频只能发30秒)

  • win10 iOS镜像版激活秘钥/神key分享 附kms激活工具+教程(苹果专用win10镜像下载)

    win10 iOS镜像版激活秘钥/神key分享 附kms激活工具+教程(苹果专用win10镜像下载)

  • Vue3 + Vite 多入口配置(vue多入口文件)

    Vue3 + Vite 多入口配置(vue多入口文件)

  • 视同销售增值税申报表怎么填写
  • 企业注销库存怎么做账务处理
  • 信息技术服务可以简易征收吗
  • 小规模费用发票多有什么用途
  • 实收资本变动额怎么算
  • 信用减值损失是什么类科目
  • 货物运费包含哪些项目
  • 企业所得税的研究论文范文
  • 核定征收财务报表
  • 职工退休金计入个人账户
  • 抵押贷款合同印花税怎么算
  • 收到银行的贷款
  • 投资可赎回基金怎么入账?
  • 房地产企业所得税预缴
  • 收到员工的罚款钱怎么写分录
  • 固定资产折旧属于制造费用吗
  • 印花税按主营业务成本计算吗
  • 移动网络的费用有哪些
  • 附加税的税率表
  • 供应商开免税的发票,为何还要收3个点税金?
  • 股利分配是在当期损益吗
  • 核定征收企业所得税应税所得率
  • 通用定额发票能用吗
  • 当月未出账费用
  • 企业收到银行未收到怎么做账
  • windows10无法打开图片
  • window最新漏洞
  • 设计费要计入固定费用吗
  • 以前年度进项税额转出会计分录怎么做
  • win11任务管理器在哪里打开
  • sdi是什么文件
  • php怎么做网页
  • qqlogin.exe是什么进程 qqlogin.exe应用程序错误解决办法
  • 电脑时间同步不了解决方法
  • 前端跨域的方法
  • 房地产企业以房产对外投资需要交什么税
  • 直接材料成本差异账户在平时登记贷方登记
  • php如何生成html
  • 房地产开发企业分为几个等级
  • 个体户查账征收2023新政策是什么
  • 老老实实的人
  • route命令的作用
  • php调用微信扫描二维码
  • 银行存款利息收入会计分录怎么写
  • 城市维护建设税是什么意思
  • 新购固定资产怎么填写申报表
  • mongodb数据库的作用
  • excel表格复杂表头
  • 增值税专用发票几个点
  • 固定资产改扩建和大修理的区别
  • 长期股权投资采用成本法核算的,应按被投资单位
  • db2常用操作语句
  • 什么叫生活补助
  • 发票与销售小票有什么区别?
  • 上月多出来的薪资怎么算
  • 独立核算的生产车间是法律主体吗
  • 交存超库存现金
  • 应交税费应交增值税减免税款
  • 营改增对企业税负影响
  • 一般纳税人会计分录
  • 结转已售材料成本6000元
  • 事业单位私车公用如何处罚
  • 虚拟机基本知识
  • windows10x预览版
  • 抢先体验的游戏可以退款吗
  • vsftpd配置用户登录目录
  • smss.exe什么意思
  • win1020h2正式版
  • w8系统怎么用
  • 十个常用linux脚本命令
  • Time、Set、Smartdrv命令的使用方法
  • Unity3D游戏开发毕业论文
  • Shell脚本监控linux系统信息
  • 批处理显示
  • 字符串拼接join
  • android数据存储实验报告
  • 零基础学JavaScript
  • 技术总结2000字
  • android进度条对话框
  • 补交以前年度城建税费怎么做账
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设