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

  • 没有销项购买税金税盘如何做账
  • 纳税人识别号怎么看是不是一般纳税人
  • 部分产品退货怎么办
  • 工程咨询属于什么合同
  • 小规模纳税人印花税怎样计算
  • 非居民企业转让财产所得税
  • 经营活动现金净流量在报表上怎么看
  • 社保基金会割肉操作吗
  • 报无票收入又开发票了怎么办?
  • 购买的专利可以进费用吗
  • 转让五年以上住房免征个人所得税吗?
  • 一般纳税人为其他公司制作标书怎么缴税?
  • 出售固定资产账务如何处理
  • 代扣代缴增值税怎么申报
  • 企业减免企业所得税怎么算
  • 收到往来款的账务处理
  • 计提法定盈余公积分录并结转
  • win11怎么关闭系统自动更新
  • 旅游服务业账务处理办法
  • 64位windows系统下安装Memcache缓存
  • PHP:session_set_cookie_params()的用法_Session函数
  • 留存收益怎么计算,它属于企业的什么资金?
  • 民办非企业的税金及附加放在哪个科目
  • win7旗舰版叫啥
  • php后端开发流程教程
  • swoole windows版本
  • 预提的奖金需要缴纳个人所得税吗
  • 高温补贴计入
  • 委托代建的法律规定
  • Chrome谷歌浏览器官网
  • 现金折扣成本变动额
  • php中undefined index
  • 残保金计入税金及附加合理吗
  • 旅游费发票可以报销吗
  • 提存计划怎么算
  • 增值税专用发票怎么开
  • 应收账款与主营业务收入的比率
  • 企业所得税季度申报表怎么填
  • 企业应收账款的主要内容
  • 企业所得税那些是免税的收入
  • 补交上年度的企业所得税税款计入什么科目
  • java队列用法
  • php headers
  • 生产成本制造费用借贷方向
  • 金蝶k3如何设置现金流量表取数公式
  • c语言http请求解析表单内容
  • 现金预算属于业务预算吗
  • 开票机号可以随便填吗
  • mysql的服务器
  • 固定资产处置当月需要计提折旧吗
  • 事业单位会计怎么做
  • 车辆购置税如何计算器
  • 暂估入账会计科目
  • 无形资产入账价值包括费用化支出吗
  • 还账准备计提方法
  • 先收发票后付款怎么做分录
  • 成本类科目借贷规则
  • xp复制粘贴功能失效
  • 彻底关闭windows10自动更新工具
  • win7系统玩英雄联盟黑屏怎么办
  • 如何让电脑启动更快
  • linux的vi使用教程
  • windows8.1正版
  • 电脑window8系统怎么样
  • squid服务器配置
  • win8怎么启动资源管理器
  • win8怎么连接宽带账号密码
  • cocos2d安装
  • js按照指定顺序排序
  • jQuery Ajax 实现在html页面实时显示用户登录状态
  • 基于nodejs的项目
  • 安卓摄像头设置在哪里
  • android开发详解
  • javascript运用
  • mac怎么编写python
  • js优化性能
  • 税务投诉撤销申诉
  • 国税局内设机构
  • 广西税务移动办税平台app
  • 消费税的征税范围包括
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设