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

  • 公司的现金收入可以直接发工资吗
  • 土地增值税计入税金及附加吗
  • 购销合同需要盖合同章吗
  • 工程中常见的土方工程有哪些
  • 未达起征点的税金如何做账
  • 专项附加扣除的钱去哪里了
  • 报销 交通费
  • 委托企业和受托企业是什么意思
  • 免费样品销售给客户计入什么科目
  • 事业单位发票名称是原来的怎么办
  • 个人账户付款可以开公司发票吗
  • 物业管理费什么时候交?
  • 建筑公司工地买空调
  • 通用机打发票没写税额
  • 上传失败显示网络不佳
  • 小规模纳税人免税怎么做账
  • 房地产开发成本占比
  • 一般纳税人企业所得税税率多少
  • 建筑服务安装费会计分录
  • 财务软件税率
  • 购物卡销售的重点工作是什么
  • 检验费用会计分录
  • php面向对象是什么意思
  • 收到客户预付的货款的会计分录
  • PHP:stream_filter_remove()的用法_Stream函数
  • 诉讼费属于什么科目类别
  • php的file函数
  • vue的自定义指令怎么用
  • php字符串包含某个字符串
  • nginx同一个端口设置两个网站
  • 承包经营所得税税率表
  • React面试题最全
  • 气温和降水空间变化一月平均气温规律是什么原因是什么
  • python操作csv
  • 车船税每年都要付吗
  • 电子回单是什么样子
  • 收到银联代收短信
  • 现金流量表要填满吗
  • 应收预收的区别
  • 案例详解:功能点估算法
  • 新公司财务需要哪些东西
  • 个人独资企业法主要内容
  • 企业所得税的营业收入包括营业外收入吗
  • 不抵扣发票可以转抵扣吗
  • 个税申报信息怎么填
  • sql动态执行
  • 资产负债表的资产按流动性大小排列
  • 磅差怎么开票
  • 采购费用属于什么会计分录
  • 地方水利建设基金怎么计算
  • mysql 查找
  • mysql日志有哪些
  • 科普知识大全
  • 应用商店升级版
  • xp 指定的域不存在,或无法联系
  • ubuntu18.04lts
  • u盘装好系统后重启无法进入系统
  • iphone中的照片如何导入mac
  • RHEL5 Apache+Tomcat整合,同时支持jsp与php
  • 安装win8.1系统步骤
  • windows8.1默认壁纸
  • win1021h2正式版
  • 如何卸载win8系统
  • linux命令eof
  • win10系统应用和功能中不能卸载
  • android开发流程
  • jquery validator
  • javascript基础笔记
  • jquery理解
  • 命令行net
  • linux 中的atq命令
  • js文件设置编码
  • canvas的原理
  • java script
  • linux装python环境
  • 主营业务收入占比高说明什么
  • 增资注册资本
  • 国税能级管理(国税局等级制度)
  • 汽车燃油税每年要交吗
  • 河南电子税务局电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设