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

  • 微信下载的文件在哪里手机储存路径是什么

    微信下载的文件在哪里手机储存路径是什么

  • 小米手机安装包在哪里找(小米手机安装包在文件目录哪里)

    小米手机安装包在哪里找(小米手机安装包在文件目录哪里)

  • xlsx怎么改成xls(xlsx怎么改成xlsx)

    xlsx怎么改成xls(xlsx怎么改成xlsx)

  • 酷喵会员能在手机优酷上用吗(酷喵会员能在手机优酷app)

    酷喵会员能在手机优酷上用吗(酷喵会员能在手机优酷app)

  • qq农场怎么赚钱最快(qq农场技巧)

    qq农场怎么赚钱最快(qq农场技巧)

  • opporeno4有防抖功能吗(opporeno4光学防抖)

    opporeno4有防抖功能吗(opporeno4光学防抖)

  • 苹果12.4和12.4.1有什么区别(ios12.2和12.4哪个好)

    苹果12.4和12.4.1有什么区别(ios12.2和12.4哪个好)

  • 手机屏幕歪了怎么调整(手机屏幕歪了怎么调整荣耀)

    手机屏幕歪了怎么调整(手机屏幕歪了怎么调整荣耀)

  • vivos1视频通话美颜怎么设置

    vivos1视频通话美颜怎么设置

  • 笔记本16g和32g内存差别大吗(笔记本16g和32g内存运行差距)

    笔记本16g和32g内存差别大吗(笔记本16g和32g内存运行差距)

  • 手机卡注销了微信还能用吗(手机卡注销了微信号还可以用吗)

    手机卡注销了微信还能用吗(手机卡注销了微信号还可以用吗)

  • 被对方拒收的消息对方能看到吗(被对方拒收的消息怎么撤回)

    被对方拒收的消息对方能看到吗(被对方拒收的消息怎么撤回)

  • 微信语音有回声怎么关(微信语音有回声因为什么)

    微信语音有回声怎么关(微信语音有回声因为什么)

  • 相机运行异常怎么修复(相机功能异常)

    相机运行异常怎么修复(相机功能异常)

  • 苹果qq不能录屏直播(苹果手机qq不能录屏直播吗)

    苹果qq不能录屏直播(苹果手机qq不能录屏直播吗)

  • 有线上网和无线上网的区别(有线上网和无线上网那个快)

    有线上网和无线上网的区别(有线上网和无线上网那个快)

  • 运算器的两个主要功能是(运算器的两个主要功能是指什么)

    运算器的两个主要功能是(运算器的两个主要功能是指什么)

  • word工具栏在哪(word工具栏在哪个菜单)

    word工具栏在哪(word工具栏在哪个菜单)

  • vivoy51是全网通吗(vivoy51s是5g)

    vivoy51是全网通吗(vivoy51s是5g)

  • 苹果无线耳机触摸位置(苹果无线耳机触碰功能)

    苹果无线耳机触摸位置(苹果无线耳机触碰功能)

  • ios13设备管理在哪里(ios13设备管理在哪找)

    ios13设备管理在哪里(ios13设备管理在哪找)

  • 更新ios12显示估算剩余时间(想更新ios12,但一直显示最新版本)

    更新ios12显示估算剩余时间(想更新ios12,但一直显示最新版本)

  • 金山文档小程序怎么删除(金山文档小程序怎么以文件形式发送)

    金山文档小程序怎么删除(金山文档小程序怎么以文件形式发送)

  • beatsx怎么放进收纳盒

    beatsx怎么放进收纳盒

  • qq和tim的区别(qq和tim的区别哪个占空间大)

    qq和tim的区别(qq和tim的区别哪个占空间大)

  • mac取消开机启动的步骤(图)(mac如何关闭开机启动)

    mac取消开机启动的步骤(图)(mac如何关闭开机启动)

  • 一个季度超过30万怎么做账
  • 小规模企业所得税会计分录怎么做
  • 依法确定的其他扣除项目包括
  • 营业成本增加会导致
  • 个体工商户转让流程
  • 金税盘到期了
  • 在建工程待摊支出例题
  • 少记财务费用如何记账
  • 加工原因造成的废品损失
  • 融资租赁出租人和承租人的区别
  • 招待客人的场景图
  • 收不回来应收账款会计分录
  • 金税三期的变化
  • 农产品收购发票上的买价含税吗
  • 存款保险能取出来钱吗
  • 不抵扣的发票怎么导入做账系统
  • 已抵扣发票丢失如何处理
  • 进项税额不得抵扣在哪个科目
  • 应交增值税进项税额转出
  • 租赁机器的支出怎么算
  • 合同返点提成犯法吗
  • 合伙项目如何进行分红
  • 企业取得代扣代缴个税手续费分录
  • 跨月预缴如何做账
  • 历年亏损企业开什么发票
  • 小规模通行费发票可以抵扣吗
  • 三险一金专项扣除怎么查
  • 预缴企业所得税怎么做账务处理
  • 负债的情况
  • 非公开发行股票是利好还是利空
  • 资本公积如何计提
  • 发票金额大于报销金额可以吗
  • win10组策略编辑器打不开怎么办
  • php-cgi
  • 股票公允价值减值怎么做账
  • 进程aissca.exe
  • js在web前端中的作用
  • php进程数量怎么决定
  • php加密文件解密
  • 企业所得税扣除限额标准
  • php二维数组按某个键值排序
  • nodejs的安装与配置mac
  • 公司借款给个人怎么写借条
  • [深度学习] 基于切片辅助超推理库SAHI优化小目标识别
  • 凭证过账后发现了错误,如何处理
  • 连锁店会计的工作内容
  • 当月确认收入可以下月确认成本吗
  • 织梦网站停止使用了还侵权吗
  • 减免税款账务处理
  • 员工食堂买菜账务流程
  • mysql 中文乱码 识别
  • 增值税专用发票电子版
  • 虚购发票进项税怎么处理
  • 小规模红冲发票收入正数税额负数
  • 预期信用损失率变更属于会计估计变更吗
  • 利息专用发票可以抵扣吗
  • 小企业如何建立党支部
  • 收款收据可以入账吗
  • 本月合计结账
  • mysqlgroupby用法解析详细
  • coms恢复出厂设定还原bios设置方法步骤讲解
  • win8.1打开软件显示Error远程配置获取失败请重新启动
  • RadioSvr.EXE - RadioSvr是什么进程 有什么用
  • pln是什么文件
  • 修改linux系统用户密码
  • nodejs发送http请求
  • threejs加载obj模型颜色不对
  • cocos2d开发的知名游戏
  • JavaScript—window对象使用示例
  • jquery如何实现双向绑定
  • jquery img onload
  • js画矩形
  • python多线程爬虫代码
  • python函数设置
  • android listview数据动态加载
  • javascript面向对象编程指南第三版
  • 小微企业税务优惠政策
  • 种子公司缴税吗多少钱
  • 浙江省税务局发短信是真的吗
  • 税务和海关哪个单位比较好
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设