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

  • 缴纳增值税做账
  • 计提的增值税
  • 微信支付宝等三方支付平台余额属于货币资金吗
  • 增值税的账务处理办法
  • 买材料通过公司走账合法吗
  • 独资企业怎么交所得税
  • 坏账准备和信用账户区别
  • 退回以前年度的增值税账务处理
  • 印花税是根据什么征收的
  • 建筑企业利润率低的原因
  • 房地产开发企业预收款预缴增值税
  • 土地使用权的账面价值计入在建工程
  • 补交税款时加收的滞纳金有上限吗
  • 稽查查补税款能缓缴
  • 核定征收企业注销后安全吗
  • 行政事业单位拨入经费
  • 半成品报废账务处理
  • 工程承建方给予的工期奖励如何做账?
  • 增值税销项发票冲红怎么冲
  • 借调员工的工资怎么入账
  • 商品编码选错税务会直接罚款吗?
  • 2017年的7月1日
  • 董事费如何计算个人所得税
  • 房地产开发公司取名
  • 销售废旧物资账务处理
  • 内含报酬率的计算公式插值法
  • 小规模纳税人能抵扣进项发票吗
  • 无形资产有使用期限
  • 先收到发票后到货分录
  • 物流公司运费账务处理
  • 销售净利率怎么分析盈利能力
  • 员工垫付款怎么做分录
  • win10老是错误
  • 减税降费是针对个人还是企业
  • 预收和应收怎么转换
  • 本地连接没有了怎么恢复
  • 调整系统保留带宽的命令
  • php file_exists 检查文件或目录是否存在的函数
  • 股权无偿赠与协议书范本
  • PasSrv.exe - PasSrv是什么进程 有什么用
  • win7打开启动
  • softag
  • vue带参数跳转到详情页面
  • window.location.href返回值
  • php框架有哪些官网
  • 会计年报表怎么做
  • 即征即退进项税转出
  • openresty php
  • typescript中文
  • 小程序unload
  • 什么发票可以抵扣企业所得税
  • 企业增值税的税收优惠有哪些
  • 未收回的货款属于什么会计科目
  • 股票股利的资金来源
  • 装修款需要开发票吗
  • 毛利率在餐饮中的应用
  • 自产用于捐赠的会计处理
  • 企业与企业之间借款都需要交什么税
  • 材料发票税额
  • 我国现行资源税主要采用什么税率
  • 筹建期的开办费开业后如何处理
  • 职工医保报销会扣医保卡的钱吗
  • 招标代理服务费计算器在线
  • 小规模纳税人可以抵税吗
  • cmd命令行窗口快捷键
  • sql批量替换字符串
  • solaris删除文件夹命令
  • linux如何操作数据库
  • mac之间传送帐号怎么传送
  • windows为什么会成功
  • msg是什么文件
  • win7系统玩游戏卡顿怎么办
  • Python实现Mysql数据库连接池实例详解
  • javascript canvas方法有哪些
  • jquery easyui插件
  • js浏览器运行机制
  • js的变量
  • java对象怎么比较
  • Android Studio --自动删除没有用的资源,给APK减减肥
  • 耕地占用税是土地增值税开发成本吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设