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

  • 面包烤箱的价格家用(面包烤箱价格)(面包店烤箱多少钱)

    面包烤箱的价格家用(面包烤箱价格)(面包店烤箱多少钱)

  • 华为p40的屏幕刷新率是60hz吗(华为p40屏幕刷新率在哪设置)

    华为p40的屏幕刷新率是60hz吗(华为p40屏幕刷新率在哪设置)

  • 苹果xr怎么设置桌面悬浮窗(苹果xr怎么设置nfc门禁卡)

    苹果xr怎么设置桌面悬浮窗(苹果xr怎么设置nfc门禁卡)

  • 华为支付保护中心在哪里(华为支付保护中心下载)

    华为支付保护中心在哪里(华为支付保护中心下载)

  • 关闭word的文档后该文档存放在(关闭word的四种方法)

    关闭word的文档后该文档存放在(关闭word的四种方法)

  • 苹果6plus拍照颤抖修复(苹果6plus拍照颤抖修复换摄像头多少钱)

    苹果6plus拍照颤抖修复(苹果6plus拍照颤抖修复换摄像头多少钱)

  • 删除是ctrl加什么(删除怎么用ctrl)

    删除是ctrl加什么(删除怎么用ctrl)

  • 180w电源能带什么显卡(180w电源能带什么集显cpu)

    180w电源能带什么显卡(180w电源能带什么集显cpu)

  • 为什么微信记录没删就没了(为什么微信记录只能保存2月)

    为什么微信记录没删就没了(为什么微信记录只能保存2月)

  • 微信朋友圈没声音了怎么回事(微信朋友圈没声音怎么办)

    微信朋友圈没声音了怎么回事(微信朋友圈没声音怎么办)

  • 电脑分号键是哪个(电脑分号在哪里打出来)

    电脑分号键是哪个(电脑分号在哪里打出来)

  • 华为 watch gt2功能介绍(华为手表watch gt2功能全面介绍)

    华为 watch gt2功能介绍(华为手表watch gt2功能全面介绍)

  • usb floppy是什么启动(usb floppy是什么意思网络用语)

    usb floppy是什么启动(usb floppy是什么意思网络用语)

  • ps怎么打竖着的字(ps怎么打竖着的书名号)

    ps怎么打竖着的字(ps怎么打竖着的书名号)

  • vivo手机安全检测怎么解除(vivo手机安全检查怎么关)

    vivo手机安全检测怎么解除(vivo手机安全检查怎么关)

  • 抖音几点发容易上热门(抖音几点发容易有浏览量)

    抖音几点发容易上热门(抖音几点发容易有浏览量)

  • 苹果11原彩显示要不要开(苹果11原彩显示打开还是关闭好)

    苹果11原彩显示要不要开(苹果11原彩显示打开还是关闭好)

  • 安卓开发用什么软件(安卓开发用什么语言)

    安卓开发用什么软件(安卓开发用什么语言)

  • 微信重新登录聊天记录还有吗(微信重新登录聊天记录还在吗)

    微信重新登录聊天记录还有吗(微信重新登录聊天记录还在吗)

  • 淘宝双十一哪年开始的(淘宝双十一是哪年开始的)

    淘宝双十一哪年开始的(淘宝双十一是哪年开始的)

  • xsmax怎么换微信提示音(苹果xsmax怎么更换微信铃声)

    xsmax怎么换微信提示音(苹果xsmax怎么更换微信铃声)

  • 区位码怎么转换16进制(区位码怎么转换二进制)

    区位码怎么转换16进制(区位码怎么转换二进制)

  • airpods怎么找其中一只(airpods 怎么找耳机)

    airpods怎么找其中一只(airpods 怎么找耳机)

  • 苹果7微信视频设置美颜(苹果7微信视频美颜怎么设置方法)

    苹果7微信视频设置美颜(苹果7微信视频美颜怎么设置方法)

  • 58同城推广余额不足怎么充值(58同城推广余额充值怎么用规定)

    58同城推广余额不足怎么充值(58同城推广余额充值怎么用规定)

  • js调用generator的方法(js调用自己)

    js调用generator的方法(js调用自己)

  • 网上申报纳税操作视频
  • 跨年增票能开红冲吗?
  • 出口货物退税的基本原则
  • 增值税相关政策
  • 月度税率表和综合所得税率表区别
  • 以前多计提的税款怎么办
  • 什么类型的电子商务
  • 工商年报资产状况可以都填0吗
  • 资产负债表利润表和现金流量表之间的关系
  • 通用发票
  • 综合年度自行申报后要怎么操作
  • 研发支出资本化支出在报表哪里
  • 房地产企业预收账款预缴企业所得税
  • 收到退款如何做账
  • 预缴增值税 已交税金
  • 外请人员所发生的费用怎么做账
  • 复利现值系数和普通年金现值系数关系
  • 公司进行债务重构的原因可能包括
  • 免税商品销售要缴税吗
  • 支付证明单打印版
  • 承租人转租需要交税吗
  • 增值税发票遗失证明
  • 自然人借款给企业的涉税风险
  • 非直接结算是什么意思
  • 移动网络的费用有哪些
  • 废品损失科目月末
  • 年度汇算清缴可以作废吗
  • 填制和审核凭证是什么意思
  • 股权投资损失怎么算出来的
  • 物流补贴需要交税吗
  • 收到购买商品发票怎么做账
  • 消防费用怎么做分录
  • smarty模板判断数组为空的方法
  • 苹果手机清理内存怎么清理微信内存
  • win10显示在哪
  • 大堡礁的现状
  • 结转应付职工薪酬会计科目
  • 财务会计制度备案信息有效期起止怎么填
  • php使用mysql
  • 金融企业贷款损失税前扣除
  • 独立核算的分公司可以享受小微企业吗
  • 借款利息记入短期借款吗
  • 研发费用税前加计扣除金额怎么算
  • 生产成本结转库存商品,怎么算知道数量以及单价
  • 官方的问答
  • mysql复制表结构及数据
  • 结转成本计入
  • 境外汇款免税
  • 申报前的增值税怎么算
  • 企业运费如何开票
  • 拍卖土地支付的法律依据
  • 个人账户打流水需要本人吗
  • 销项发票导出为什么是乱码
  • 利息专用发票可以抵扣吗
  • 银行手续费必须开发票的规定
  • 明细账建账的步骤
  • centos如何查询ip
  • 各种linux系统比较
  • win7调出ie浏览器
  • win7用户在哪
  • unity3d界面布局
  • linux中文件权限读写执行的三种标志符号依次是
  • 清理ie八
  • Build Qt5.3.1 for Freescale I.MX6Q based Linux 3.0.15
  • cmd 远程登录
  • linux监控cpu使用率脚本
  • unity删除对象
  • unity3d游戏开发标准教程pdf
  • monkey命令大全
  • python 内置函数什么用来返回序列中的最大元素
  • unity物体碰撞爆炸
  • JavaScript中的数据类型
  • jquery编写Tab选项卡滚动导航切换特效
  • python访问oracle
  • javascript面向对象吗
  • 江苏地税电子税务局官网登录
  • 唐山宴订餐电话是多少
  • 我的宁夏灵活就业缴费失败
  • 网上如何申领电瓶车牌照
  • 镇江市物业管理协会
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设