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

  • 微信音乐怎么导入本地音乐(微信音乐怎么导出来)

    微信音乐怎么导入本地音乐(微信音乐怎么导出来)

  • 黄钻加倍卡在哪里使用(黄钻加倍卡在哪领取)

    黄钻加倍卡在哪里使用(黄钻加倍卡在哪领取)

  • 微信登录错误是什么意思(微信登陆出现错误)

    微信登录错误是什么意思(微信登陆出现错误)

  • 微信下载安装不了显示解析包错误(微信下载安装不了怎么办)

    微信下载安装不了显示解析包错误(微信下载安装不了怎么办)

  • magicui和emui的区别(magicui与emui)

    magicui和emui的区别(magicui与emui)

  • 什么手机用久了不卡(什么手机用久了会卡)

    什么手机用久了不卡(什么手机用久了会卡)

  • 原装充电器和不是原装有什么区别(原装充电器和不是原装对手机有影响吗)

    原装充电器和不是原装有什么区别(原装充电器和不是原装对手机有影响吗)

  • 苹果怎么关闭下载东西输入id密码(苹果怎么关闭下拉菜单)

    苹果怎么关闭下载东西输入id密码(苹果怎么关闭下拉菜单)

  • 苹果手机屏幕颜色异常(苹果手机屏幕颜色)

    苹果手机屏幕颜色异常(苹果手机屏幕颜色)

  • 错误码7610001什么意思(错误码7610034什么意思)

    错误码7610001什么意思(错误码7610034什么意思)

  • 在windows中双击驱动器图标的作用是什么(在windows中双击控制菜单图标可以关闭窗口)

    在windows中双击驱动器图标的作用是什么(在windows中双击控制菜单图标可以关闭窗口)

  • vivoy71和y71a手机壳一样吗(vivoy71和y71a手机壳能通用吗)

    vivoy71和y71a手机壳一样吗(vivoy71和y71a手机壳能通用吗)

  • wifi连接不上显示密码错误(wifi连接不上显示ip配置失败)

    wifi连接不上显示密码错误(wifi连接不上显示ip配置失败)

  • ppt全屏播放如何暂停(ppt全屏播放如何退出当前页面)

    ppt全屏播放如何暂停(ppt全屏播放如何退出当前页面)

  • vivox30左侧按键的作用(vivox30左侧按键怎么不能用)

    vivox30左侧按键的作用(vivox30左侧按键怎么不能用)

  • 微机计算机硬件系统的性能主要取决于(微机计算机硬件系统)

    微机计算机硬件系统的性能主要取决于(微机计算机硬件系统)

  • 手机为什么网络连接正常却上不了网(手机为什么网络差)

    手机为什么网络连接正常却上不了网(手机为什么网络差)

  • 华为nova上市时间(华为nova上市时间表)

    华为nova上市时间(华为nova上市时间表)

  • 抖音每天可以发几个视频(抖音每天可以发多少视频)

    抖音每天可以发几个视频(抖音每天可以发多少视频)

  • 苹果接电话听筒没声音(苹果手机话筒声音小怎么处理)

    苹果接电话听筒没声音(苹果手机话筒声音小怎么处理)

  • 苹果手机里的手势是干嘛用的(苹果手机里的手电筒在哪里找)

    苹果手机里的手势是干嘛用的(苹果手机里的手电筒在哪里找)

  • y93可以指纹支付吗(vivo y93有指纹付款功能吗?)

    y93可以指纹支付吗(vivo y93有指纹付款功能吗?)

  • 格式刷的快捷键(wps格式刷的快捷键)

    格式刷的快捷键(wps格式刷的快捷键)

  • Java使用WebStocket实现前后端互发消息(java使用循环结构输出九九乘法表)

    Java使用WebStocket实现前后端互发消息(java使用循环结构输出九九乘法表)

  • 销售商品返还现金
  • 所得税报表的营业成本
  • 外贸企业账务处理及报税
  • 账面价值与计税基础之间没有差别只是计价的两种名称
  • 民办非企业工会经费
  • 厂区地面硬化属于土建还是市政
  • 金税系统怎么录入专票
  • 内部报送会计信息有哪些
  • 企业所得税清算报备表清算结束日
  • 合并财务报表内部交易对净利润影响
  • 工业企业会计怎么结转成本
  • 应交增值税明细科目如何结转
  • 企业股权转让留存收益可以扣除吗
  • 购买的固定资产没有使用,是否计提折旧
  • 挂应付账款之后发现用现金付款如何调整?
  • 子公司注销资产负债表如何合并
  • 发票认证费用
  • 非增值税纳税人有哪些
  • 记账凭证是否要记账
  • 委托贷款利息收入现金流
  • 代开的专票怎么做账?
  • 内含报酬率的计算公式插值法
  • 中途建账期初余额错误怎么纠正
  • 收入可以用收据入账吗
  • 外贸企业出口退税账务处理
  • 建筑公司异地预缴增值税
  • 哪些抵押物必须登记才有效
  • 报税系统维护费怎么入账
  • 经济作物国家有什么补助吗
  • 苹果macOS 13.3 RC 发河北承德市承德县华夏电器
  • 有销项无进项税务局会怎么罚
  • 一借多贷的会计分录怎么写
  • 开发商违法
  • vue-cli typescript
  • 代收税款是什么意思
  • 上月未开发票的销项税,已经申报缴税,在本月开了票,应该如何填报?
  • javaweb项目开发的原理
  • 报税营业成本可以乱填吗
  • vuecdn方式引入
  • 百度地图 申请
  • vue3版本网页小游戏
  • css基础入门
  • php json数据
  • 招待费发票怎么做分录
  • 收到多开发票的会计分录
  • 织梦安装步骤
  • 企业法人个人贷款哪里好贷
  • 收益性支出包括哪些内容
  • 哪些情况发票可以红冲
  • 企业出现销售折扣的原因
  • 2020年附加税减免怎么填报表
  • 委托加工存货收回后直接用于销售的账务处理
  • 出口退税的会计处理
  • 认证固定资产发票如何入账
  • 会计原材料的账怎么记账
  • 未开票收入账务处理分录
  • 结算本月职工工资,其中生产甲产品
  • 企业召开会议的目的
  • 2008sql附加数据库
  • mysql查看使用情况
  • 运行软件时遇到的问题
  • centos配置vps
  • win8右下角图标不见了
  • win8.1文件夹选项
  • 如何隐藏与显示元素
  • searchnavversion.exe - searchnavversion是什么进程 作用是什么
  • win7系统无法开机解决方法
  • Apache 2.0.55 for Linux 下载
  • unity 手册
  • ubuntu运行qt程序
  • 微信小程序页面滚动
  • perl 运算
  • javascript零基础
  • jquery.data
  • jquery input checked
  • 江苏地税电子税务局官网登录
  • 江苏税务个人所得税app下载
  • 国家税务总局关于新型墙体材料增值税政策的通知
  • 省纪检委派驻机构值得去么
  • 个人所得税优惠政策最新2023年度
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设