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

  • 为什么微信提示音开着但不响(为什么微信提示对方账号安全性未知)

    为什么微信提示音开着但不响(为什么微信提示对方账号安全性未知)

  • 苹果xs充电到80不动了(苹果xs充电到80苹果10w头可以充手机吗)

    苹果xs充电到80不动了(苹果xs充电到80苹果10w头可以充手机吗)

  • 苹果手机微信屏幕黑色怎么变过来(苹果手机微信屏幕锁)

    苹果手机微信屏幕黑色怎么变过来(苹果手机微信屏幕锁)

  • vivo手机广告怎么关掉(vivo手机广告怎么关闭)

    vivo手机广告怎么关掉(vivo手机广告怎么关闭)

  • 小米10镜头膜有必要贴吗(小米10 镜头膜)

    小米10镜头膜有必要贴吗(小米10 镜头膜)

  • QQ号没绑定手机怎么找回QQ(qq号没绑定手机号被盗了怎么办)

    QQ号没绑定手机怎么找回QQ(qq号没绑定手机号被盗了怎么办)

  • 手机tmp文件用什么打开(tmp手机文件用什么打开)

    手机tmp文件用什么打开(tmp手机文件用什么打开)

  • p30有没有无线充电功能(p30手机有没有无线充电)

    p30有没有无线充电功能(p30手机有没有无线充电)

  • ipadpro11寸和12.9寸区别(ipadpro11寸和12.9寸屏幕比例)

    ipadpro11寸和12.9寸区别(ipadpro11寸和12.9寸屏幕比例)

  • 存储主要分为哪些类型(存储主要分为哪两类)

    存储主要分为哪些类型(存储主要分为哪两类)

  • 流量提醒在哪里设置(流量提醒在哪里打开)

    流量提醒在哪里设置(流量提醒在哪里打开)

  • 抖音短视频打不开怎么回事(抖音为啥打不了视频)

    抖音短视频打不开怎么回事(抖音为啥打不了视频)

  • 苹果11主题在哪里设置(苹果11手机主题在哪)

    苹果11主题在哪里设置(苹果11手机主题在哪)

  • 新闻APP开发能实现哪些功能(新闻软件开发)

    新闻APP开发能实现哪些功能(新闻软件开发)

  • 一加7p有耳机孔吗(一加7pro手机耳机插孔在哪里)

    一加7p有耳机孔吗(一加7pro手机耳机插孔在哪里)

  • 苹果的表情符号在哪里(苹果的表情符号华为能收到吗)

    苹果的表情符号在哪里(苹果的表情符号华为能收到吗)

  • 问卷星多次提交有效吗(问卷星多次提交会记录哪次结果)

    问卷星多次提交有效吗(问卷星多次提交会记录哪次结果)

  • 苹果11系统快捷键设置(苹果11系统快捷键怎么关)

    苹果11系统快捷键设置(苹果11系统快捷键怎么关)

  • 陌陌语音通话在哪(陌陌语音功能)

    陌陌语音通话在哪(陌陌语音功能)

  • w10如何退出杀毒软件(怎样退出win10杀毒软件)

    w10如何退出杀毒软件(怎样退出win10杀毒软件)

  • 主板故障之开机无显示的维修案例有哪些?(主板故障开机断电)

    主板故障之开机无显示的维修案例有哪些?(主板故障开机断电)

  • Windows7纯净版系统中把截图工具添加到桌面上的方(win7纯净版系统官网)

    Windows7纯净版系统中把截图工具添加到桌面上的方(win7纯净版系统官网)

  • 【youcans的OpenCV例程300篇】总目录(opencv canny)

    【youcans的OpenCV例程300篇】总目录(opencv canny)

  • 织梦dedecms手机版伪静态教程(织梦手机端)

    织梦dedecms手机版伪静态教程(织梦手机端)

  • 个税申报的收入是应发还是实发
  • 分配股东利润分录
  • 税务稽查最坏结果不知情人员怎么办
  • 金蝶入账流程
  • 预付卡发票可以报销吗?
  • 实收资本增加的印花税
  • 研发加计扣除减免税
  • 发票冲红需要什么手续
  • 没收逾期未退包装物押金收益,应计入( )科目
  • 评估价与成交价相差多少合法
  • 增值税为什么不重复征税
  • 样机销售是什么意思
  • 发票已经开但是没有收到发票怎么做
  • 过路费去年的票还可以用吗
  • 公司账上的存货是怎么来的
  • 企业会计准则财务报表本期金额和上期金额
  • 子公司是否可以共享总公司的资质
  • 企业所得税分期收款确认收入的时间政策
  • 货币资金核算流程设计
  • 库存商品转结
  • 1697510552
  • 股东投入的资金可以计入资本公积吗
  • 营改增后城建税和教育费附加包含在哪里
  • 材料采购费用的是
  • 怎么用u盘启动dos
  • 有什么好方法可以让小孩子少吃糖
  • 取得基建借款分录
  • 哪些情况需要做进项税转出
  • php 使用 AWS kinesis
  • 转出未交增值税借方余额表示什么
  • php微信公众号开发反回图片怎么弄的学校
  • php获取用户信息
  • 集团公司对子公司的内部审计
  • 电影制片过程
  • 应付职工薪酬如何确认
  • 会计人员信息采集怎么看审核通过
  • 应交所得税的科目是什么
  • access中宏是按什么调用的
  • 金税盘离线开票时间超限怎么办
  • 影响存货管理的因素有哪些
  • sql server 2008 2014
  • 人员经费指的是
  • 含税含运费价格,运费谁出
  • 高铁票丢失了可以补打吗
  • 账务核对包括哪些内容
  • 闽侯县安置房交易缴纳土地出让金
  • 外聘专家费用标准
  • 附加税的计税依据是增值税实际缴纳税款吗
  • 二手设备进口报关流程
  • 发票有什么重要性
  • 个体户4年不注销有事吗
  • 外购的商品用于生产
  • 开票软件信息备份怎么备份
  • 会计往来账怎么用excel做更快
  • 从农业生产者手中购进免税农产品
  • 记账凭证的附件数可以手改吗
  • mysql7.x单独安装mysql的方法
  • fedora debian ubuntu
  • xp系统安装软件重复
  • ubuntu x
  • Ubuntu上安装jdk
  • freebsd忘记root密码
  • msoobe.exe是什么
  • win8怎么设置开机直接进入桌面
  • centos7查看性能监控
  • iptables用法
  • xp升win10教程
  • win8.1开机自启项目在哪里
  • 找不到config/index taro
  • win7win8双系统怎么装
  • bootstrap怎么引用
  • javaweb物流管理系统源码
  • 关于javascript函数
  • excel替换一行内容
  • js中arguments
  • 置顶txt
  • python怎么编写二维码
  • Android java.lang.IllegalArgumentException: pointerIndex out of range
  • 前端开发的工作流程
  • 工商注册app是不是在手机上可以完全操作
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设