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

  • ipad pro是高刷屏吗(ipadpro2020高刷屏)

    ipad pro是高刷屏吗(ipadpro2020高刷屏)

  • 拼多多怎么删除直播间(拼多多怎么删除订单记录)

    拼多多怎么删除直播间(拼多多怎么删除订单记录)

  • ipad鼠标滚轮反了(ipad鼠标滚轮反转)

    ipad鼠标滚轮反了(ipad鼠标滚轮反转)

  • 手机充电屏幕有点失灵(手机充电屏幕有点失灵怎么解决)

    手机充电屏幕有点失灵(手机充电屏幕有点失灵怎么解决)

  • 红米10x有nfc功能吗(红米10x nfc在手机哪里能找到)

    红米10x有nfc功能吗(红米10x nfc在手机哪里能找到)

  • 智学网老师可以看见学生吗(智学网老师可以手动输成绩吗)

    智学网老师可以看见学生吗(智学网老师可以手动输成绩吗)

  • ios设备管理信任不见了(ios设备管理信任会有什么影响?)

    ios设备管理信任不见了(ios设备管理信任会有什么影响?)

  • 电脑迅雷是干啥用的(电脑迅雷在哪个文件夹)

    电脑迅雷是干啥用的(电脑迅雷在哪个文件夹)

  • 华为手机跑马灯怎么设置(华为手机跑马灯在哪里设置)

    华为手机跑马灯怎么设置(华为手机跑马灯在哪里设置)

  • 小米双微信打不开文件(小米微信双开另一个没有提示)

    小米双微信打不开文件(小米微信双开另一个没有提示)

  • 提交候补需求单失败是什么原因(提交候补需求单失败请您重新查询是什么原因)

    提交候补需求单失败是什么原因(提交候补需求单失败请您重新查询是什么原因)

  • win10开机黑屏(win10开机黑屏一会才进桌面)

    win10开机黑屏(win10开机黑屏一会才进桌面)

  • qq音乐包可以听vip音乐吗(qq音乐开通音乐包)

    qq音乐包可以听vip音乐吗(qq音乐开通音乐包)

  • ipodtouch和手机区别(ipod touch和手机)

    ipodtouch和手机区别(ipod touch和手机)

  • word文档字体怎么竖着排列(word文档字体怎样竖着)

    word文档字体怎么竖着排列(word文档字体怎样竖着)

  • 苹果11发短信怎么切换卡(苹果11发短信怎么显示已读)

    苹果11发短信怎么切换卡(苹果11发短信怎么显示已读)

  • wsdl文件直接生成(wsdl文件用什么打开)

    wsdl文件直接生成(wsdl文件用什么打开)

  • 京东怎么延长确认收货(京东怎么延长确定收货)

    京东怎么延长确认收货(京东怎么延长确定收货)

  • 吸顶式无线ap可接多少个(吸顶式无线ap设置方法)

    吸顶式无线ap可接多少个(吸顶式无线ap设置方法)

  • administrator密码忘了(administrator密码忘记了怎么办)

    administrator密码忘了(administrator密码忘记了怎么办)

  • b站视频下载在哪(b站视频下载在哪找)

    b站视频下载在哪(b站视频下载在哪找)

  • 苹果6是什么屏幕(苹果是什么屏幕玻璃)

    苹果6是什么屏幕(苹果是什么屏幕玻璃)

  • 华为p30是50倍变焦吗(华为p30五十倍怎么调)

    华为p30是50倍变焦吗(华为p30五十倍怎么调)

  • kaggle注册以及数据集下载全流程(kaggle官网注册)

    kaggle注册以及数据集下载全流程(kaggle官网注册)

  • 个人独资企业要交税吗
  • 机票抵扣进项税怎么填申报表
  • 增值税普通
  • 现代服务包含哪些服务
  • 公司注册后一直没有营业怎么办
  • 员工单独购买工伤保险可以吗
  • 免交附加税政策
  • 费用化支出期末结转
  • 增值税零申报触发附加税零申报
  • 企业发生破产清算
  • 中小企业怎么避税
  • 出差旅费补助报销明细表需要发票吗?
  • 现金短缺溢余求借多少短期借款?
  • 报销增值税专票绿的
  • 分公司单独做账吗
  • 停工损失会计科目
  • 增值税专用发票可以开电子发票吗
  • 个人所得税返还奖励财务人员做账
  • 2017年的7月1日
  • 宽带合同属于什么合同
  • 报废车辆补贴收据怎么写
  • 个人独资企业收款码
  • 企业名称变更后社保也要变更吗
  • 公司职员培训与管理
  • 个人独资企业怎么取钱
  • mac安装软件提示需要更高版本
  • 怎么解决笔记本电脑卡顿问题
  • 购买机器设备配件账务处理
  • 物业公司成本结转方案
  • Win10 20H1/20H2 KB5001391补丁今日发布(内附下载)
  • PHP:session_set_save_handler()的用法_Session函数
  • php 正则表达式
  • 税款返还的会计处理方法
  • 会计凭证应该如何录入的方法
  • 损益类科目月末结转到哪个科目
  • 公司的财产保险包括哪些
  • php操作mysql数据库的扩展有哪三个
  • 【深度学习】datasets.ImageFolder 使用方法
  • vue请求后端接口
  • pytorch nn.parameters
  • php中的数据类型有哪些?
  • 怎样利用 getnext 命令检索未知对象?
  • 购买原材料的运输费计入什么科目
  • 应付票据是商业承兑汇票吗
  • 附有销售退回条件的商品销售,如果不能对退货
  • 报税报错了能否下月调整
  • 开房租发票交的税因优惠政策退税如何账务处理?
  • 工程施工和工程结算的账务处理
  • 税收分类编码是什么意思啊
  • 用发票做账是什么意思?
  • 小企业的固定资产的折旧方法可以根据需要
  • 其他综合收益算不算所有者权益
  • 个税申报哪些可以减免
  • 银行存款属于其他收益吗
  • 收到银行开的手续费发票如何做帐
  • 分配现金股利如何做会计分录长投
  • 疫情防控免税政策
  • 银行日记账上月的余额要结转吗
  • 工程安装公司注册条件
  • sql多级汇总
  • 重装系统清空
  • mac安装git客户端
  • windows组策略a-g-dl-p
  • windows8主题桌面
  • win8正版系统自带
  • win8.1出现了一些问题
  • windos10正式版
  • linux 如何
  • opengl 位图
  • net命令用法
  • 不错的mod_perl编程的简单应用实例介绍
  • coco触控
  • linux压缩tar文件命令
  • isscroll.js
  • shell脚本特性
  • jquery实战
  • js常用方法总结
  • python中编写程序
  • 国税地税什么时候申报
  • 轮胎消费税的征收环节
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设