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

  • 励志小故事精选(励志小故事精选100字)

    励志小故事精选(励志小故事精选100字)

  • 淘宝购物车怎么扩大200容量(淘宝购物车怎么分享给朋友)

    淘宝购物车怎么扩大200容量(淘宝购物车怎么分享给朋友)

  • 手机号码怎么申请微信号(手机号码怎么申请苹果id)

    手机号码怎么申请微信号(手机号码怎么申请苹果id)

  • qq如何隐身离线状态(qq怎样隐身离线)

    qq如何隐身离线状态(qq怎样隐身离线)

  • 闲鱼申请退款卖家不理(闲鱼申请退款卖家不同意)

    闲鱼申请退款卖家不理(闲鱼申请退款卖家不同意)

  • 酷狗彩铃要钱吗(酷狗里面的彩铃要钱吗)

    酷狗彩铃要钱吗(酷狗里面的彩铃要钱吗)

  • 腾讯课堂怎么关摄像头(腾讯课堂怎么关麦)

    腾讯课堂怎么关摄像头(腾讯课堂怎么关麦)

  • 抖音的收货地址在哪里修改(怎样删除抖音的收货地址)

    抖音的收货地址在哪里修改(怎样删除抖音的收货地址)

  • 移动手机号停机多久会被注销如何恢复(移动手机号停机后多长时间会自动注销)

    移动手机号停机多久会被注销如何恢复(移动手机号停机后多长时间会自动注销)

  • vivox27的功能介绍(vivox27特色功能)

    vivox27的功能介绍(vivox27特色功能)

  • ps如何复制(ps如何复制一个一模一样的图形)

    ps如何复制(ps如何复制一个一模一样的图形)

  • 苹果手机夜间模式怎么关闭(苹果手机夜间模式在哪)

    苹果手机夜间模式怎么关闭(苹果手机夜间模式在哪)

  • 手机掉了余额宝怎么办(手机掉了余额宝里的钱怎么办)

    手机掉了余额宝怎么办(手机掉了余额宝里的钱怎么办)

  • 手机怎么叫外卖(手机上怎样点外卖)

    手机怎么叫外卖(手机上怎样点外卖)

  • 荣耀20和20i区别(华为荣耀20和荣耀20i哪个好)

    荣耀20和20i区别(华为荣耀20和荣耀20i哪个好)

  • 宝马标志设计理念及含义(宝马汽车logo设计理念)

    宝马标志设计理念及含义(宝马汽车logo设计理念)

  • oppor17手机多长厘米(oppor17pro手机参数)

    oppor17手机多长厘米(oppor17pro手机参数)

  • imessage怎么放烟花

    imessage怎么放烟花

  • id card全称(id card全称怎么读)

    id card全称(id card全称怎么读)

  • ps邮票的齿轮怎么画(ps制作邮票齿轮边框简单)

    ps邮票的齿轮怎么画(ps制作邮票齿轮边框简单)

  • oppoa9视频怎么美颜(oppo手机的视频美颜功能在哪里a9)

    oppoa9视频怎么美颜(oppo手机的视频美颜功能在哪里a9)

  • 网络安全与安全上网(网络安全与安全教育内容)

    网络安全与安全上网(网络安全与安全教育内容)

  • 苏格兰高地上的欧亚红松鼠,苏格兰 (© Scotland: The Big Picture/Minden Pictures)(苏格兰高地什么意思)

    苏格兰高地上的欧亚红松鼠,苏格兰 (© Scotland: The Big Picture/Minden Pictures)(苏格兰高地什么意思)

  • Asian elephants in West Bengal, India (© Avijan Saha/Minden Pictures)

    Asian elephants in West Bengal, India (© Avijan Saha/Minden Pictures)

  • 计算机视觉竞赛技巧总结(二):图像分割基础篇(计算机视觉竞赛很重要吗)

    计算机视觉竞赛技巧总结(二):图像分割基础篇(计算机视觉竞赛很重要吗)

  • 个人所得缴税租房减免该怎么弄?
  • 新公司什么时候开始建账
  • 收到上年度所得税发票
  • 企业所得税年报过了申报期还能修改吗
  • 企业买车购置税跟个人一样吗
  • 如何查询公司的财务负责人
  • 非金融单位贷款利息收入列示什么科目
  • 发放遗属补助还要拍照片吗山东
  • 公司注销固定资产怎么处理税怎么交
  • 出售无形资产和转让无形资产
  • 个人自产自销农产品免税政策
  • 成立企业的步骤
  • 融资租赁承租方会计账务处理流程
  • 冲以前年度成本会计处理
  • 税控减免税结转怎么操作
  • 外购材料委托加工分录
  • 无形资产投资入股增值税
  • 采购合同清单的安装调试费如何开具发票?税率是多少
  • 联营扣点怎么核算保本费用
  • 企业股权设计咨询这个行业怎么样
  • 期末未缴税额为正是什么意思
  • 支票遗失要怎么补办
  • 土地契税税率怎么计算
  • 一般纳税人和小规模纳税人的区别
  • 法院扣款图片
  • 国税增值税定额计算公式
  • win8.1电脑设置在哪里
  • php面向对象优点,缺点
  • 对公账户代扣
  • PHP:Memcached::getMulti()的用法_Memcached类
  • 公司收到款后怎么做账
  • 设备销售合作协议书范本
  • php编程入门教程
  • 手撕发票怎样盖章子
  • php获取地理位置
  • framework教程
  • js中...的用法
  • 分页浏览是什么意思
  • 服务业加计扣除比例
  • 以房租入股股份怎么计算
  • 帝国cms批量excel导入文章
  • 不良品扣款入什么科目
  • 税前利润包含
  • 小规模企业所得税怎么征收
  • 增值税扣税凭证不包括
  • 进项税计税依据
  • 建筑企业跨地区经营企业所得税
  • 注册资金认缴和实缴的法律风险
  • sql server5120
  • 沙石料进项发票
  • 银行对帐单
  • 为什么收款金额跟实时入帐金额会不一样农村信用社
  • 固定资产的折余价值和账面价值如何确定
  • 建筑安装业,指从事____的企业
  • 一般哪些收据可以抵扣
  • 出口退税进项税额转出怎么申报
  • 委托加工商品属于什么资产
  • 专项资金补助经费如何入账
  • 进项税额转出多了怎么调整
  • 现值指数与净现值的关系
  • 高新企业 要求
  • mysql数据库技术介绍
  • mysql的知识点
  • mysql闪退怎么回事
  • windosxp无法启动
  • Windows Server AD 访问数量控制配置方法
  • ubuntu如何创建文件
  • ubuntu20.04亮度调节
  • linux用户空间获取TCP序号
  • win7系统安装谷歌浏览器
  • win10盘符怎么看
  • css选择器 菜鸟教程
  • Unity C#用WWW操作数据库
  • Python3.6正式版新特性预览
  • 陕西省医保缴费截止日期2024
  • 武汉市契税减免政策
  • 上海税务局实名认证流程
  • 企业所得税优惠事项管理目录2023
  • 天津市东丽区军粮城派出所电话
  • 重庆市大足区迪涛中学那几个是尖子班
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设