位置: IT常识 - 正文

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

发布时间:2024-01-26
###结果以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有什么用)

  • 一般纳税人主表第一栏数据
  • 预缴增值税的附加税
  • 汇算清缴所得税补缴怎么处理
  • 个人独资企业处罚听证的标准
  • 贸易类公司做产品代理账务如何处理
  • 税务登记后怎么领发票
  • 雇主责任险为什么不能立即生效
  • 建筑业购进苗木进项抵税计算公式是什么
  • 建筑企业跨地区
  • 个体各商户的社保
  • 替票和代票的区别是什么
  • 企业的对公支出是什么
  • 家具上的木蜡油味去除
  • 工程项目预缴税金
  • 建筑企业预缴企业所得税会计分录
  • 进项是普票销项是专票,怎么交税
  • 如何冲回以前年度账户
  • 请等待当前程序完成或更改怎么弄
  • win10打开txt
  • msvcp140.dll丢失怎么办
  • php连接mysql数据库详细步骤(图文)
  • 苹果14pro真实图片发朋圈
  • 增值税进项税转出什么意思
  • 什么是坏账,坏账的核算方法有哪些
  • 小米路由器599元
  • mp3格式最高音质
  • laravel自带队列效率
  • laravel app接口
  • php读取mysql
  • 基于中国国情的中国式现代化具有哪些特色
  • 简述资产负债表债务法
  • 信用减值损失在资产负债表中怎么表示
  • python去掉文本的指定符号
  • 应纳所得税额等于利润总额减去差异
  • 应收票据包括哪些项目内容
  • 现金盘盈盘亏怎么处理
  • Android ViewPager2 + Fragment 联动
  • 工业企业变压器容量费用
  • 银行收到几分钱怎么做账
  • 专用发票金额与专票不符
  • mssqlserver数据能删吗
  • 无形资产的摊销计入什么科目
  • 事业单位利息收入的正确分录
  • 营改增后预交营业税怎么处理
  • 暂估成本多久要冲掉
  • 工资社保医保计算
  • 企业发展基金返还条件
  • 建筑企业结转成本能不能不分人材机
  • 未完工的工程施工怎么处理
  • 金税盘维护费抵减分录
  • 研发一个月多少钱
  • 工业企业成本占比多少合适
  • 原始凭证基本要求是什么
  • 公司电子发票报销
  • 借款利息怎么记账
  • sql server的相关技术知识
  • mysql的三种查询方式
  • ubuntu系统安装无线网卡驱动
  • 如何安装vista
  • Fedora 9 texlive + vim-latex + kile安装配置
  • xp电脑怎么样
  • window配置在哪
  • wind10怎么恢复wind7
  • 4G内存时linux的mtrr表不正确的解决
  • 错误代码0x8007007B
  • windows7 读不了u盘怎么解决
  • windows7的注册表在哪里
  • 在Linux上优化Mysql运行环境让你对Mysql更多了解
  • javascript有哪些类型
  • python整数数字
  • css旋转木马
  • nodejs怎么下载其他版本
  • Node.js中的事件循环是什么
  • javascript面向对象吗
  • 上海自由贸易区图片
  • 深圳企业公积金更改代扣银行
  • 请问地税是省直单位吗
  • 广东省国家税务总局班子成员
  • 新能源车需要缴纳购置税吗?
  • 开票系统功能
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号