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

  • 芒果tv怎么看手机号登录了几个客户端(芒果tv怎么看手机号登录)

    芒果tv怎么看手机号登录了几个客户端(芒果tv怎么看手机号登录)

  • 华为蓝牙耳机怎么配对其他手机(华为蓝牙耳机怎么打开开关)

    华为蓝牙耳机怎么配对其他手机(华为蓝牙耳机怎么打开开关)

  • 苹果13的nfc怎么添加门禁卡(苹果13的nfc怎么设置门禁卡)

    苹果13的nfc怎么添加门禁卡(苹果13的nfc怎么设置门禁卡)

  • 怎么设置优先扣苹果id余额(怎么设置优先扣花呗)

    怎么设置优先扣苹果id余额(怎么设置优先扣花呗)

  • 华为p40系列后盖是什么材质呢(华为手机p40后盖)

    华为p40系列后盖是什么材质呢(华为手机p40后盖)

  • 文档怎么搜索关键字(文档里搜索)

    文档怎么搜索关键字(文档里搜索)

  • 电脑显示器连接主机的线怎么插(电脑显示器连接机顶盒)

    电脑显示器连接主机的线怎么插(电脑显示器连接机顶盒)

  • qq加好友要发短信验证(qq加好友要发短信)

    qq加好友要发短信验证(qq加好友要发短信)

  • 苹果11怎么调静音模式(苹果11怎么调静音模式下震动)

    苹果11怎么调静音模式(苹果11怎么调静音模式下震动)

  • 斗鱼虎牙都是腾讯的吗(斗鱼虎牙和腾讯)

    斗鱼虎牙都是腾讯的吗(斗鱼虎牙和腾讯)

  • 苹果7p怎么双击截屏(苹果7p怎么双击截屏手机屏幕)

    苹果7p怎么双击截屏(苹果7p怎么双击截屏手机屏幕)

  • QQ已经实名认证了为什么还是限制时间(qq已经实名认证了为什么还有防沉迷)

    QQ已经实名认证了为什么还是限制时间(qq已经实名认证了为什么还有防沉迷)

  • ps怎么让文字变成扇形(ps怎么让文字变圆滑)

    ps怎么让文字变成扇形(ps怎么让文字变圆滑)

  • 开机自启项在哪里设置(开机自启动怎么打开)

    开机自启项在哪里设置(开机自启动怎么打开)

  • 安卓照片怎么迁移苹果(安卓照片怎么迁移到苹果手机 知乎)

    安卓照片怎么迁移苹果(安卓照片怎么迁移到苹果手机 知乎)

  • 虾米音乐怎么上传音乐(虾米音乐怎么唱歌)

    虾米音乐怎么上传音乐(虾米音乐怎么唱歌)

  • 苹果手机网络诊断正在哪里(iphone网络)

    苹果手机网络诊断正在哪里(iphone网络)

  • 如何让手机录的视频更清晰(如何让手机录的视频内存变小)

    如何让手机录的视频更清晰(如何让手机录的视频内存变小)

  • 如何破解不支持此配件(不支持解锁请切换到常规模式)

    如何破解不支持此配件(不支持解锁请切换到常规模式)

  • oppor15右上角显示耳机(oppo 手机右上角有个菜单怎么取消)

    oppor15右上角显示耳机(oppo 手机右上角有个菜单怎么取消)

  • 手机otc怎么打开(红米手机otc怎么打开)

    手机otc怎么打开(红米手机otc怎么打开)

  • 蚂蚁森林能量球是什么(蚂蚁森林能量球怎么不显示数值)

    蚂蚁森林能量球是什么(蚂蚁森林能量球怎么不显示数值)

  • 苹果导航键在哪里设置(苹果导航键在哪里打开)

    苹果导航键在哪里设置(苹果导航键在哪里打开)

  • 云闪付如何赚钱(云闪付怎么赚佣金)

    云闪付如何赚钱(云闪付怎么赚佣金)

  • 华为mate20智能识物(mate20 智慧感知)

    华为mate20智能识物(mate20 智慧感知)

  • 微信查找附近的人显示操作不成功(微信查找附近的群)

    微信查找附近的人显示操作不成功(微信查找附近的群)

  • 高手养成计划基础篇-Linux第一季(高手成长礼包)

    高手养成计划基础篇-Linux第一季(高手成长礼包)

  • 【Pytorch深度学习实战】(11)变分自动编码器(VAE)

    【Pytorch深度学习实战】(11)变分自动编码器(VAE)

  • 递延所得税负债账务处理
  • 年末是否结转本年利润
  • 无形资产减值准备可以转回吗
  • 计提减值准备是什么凭证
  • 资产处置损益属于当期损益吗
  • 年报从业人数可以填一人吗
  • 财产租赁合同印花税率多少
  • 设计服务类合同
  • 医院会计制度准则
  • 房租合同印花税计算方法
  • 汇算清缴跨年发票
  • 现金折扣在买方还是卖方
  • 企业融资租赁设立条件
  • 转销无形资产的处置流程
  • 采购工程物资会议纪要
  • 土地使用权出让和划拨有什么区别
  • 增值税普通发票税率
  • 不征税收入税屋
  • 税种认定登记流程
  • 代开专票作废需要什么资料?
  • 固定资产折旧税务处理
  • 增值税电子发票没有发票专用章
  • 备抵法计提坏账准备的公式
  • win10删除所有内容是什么意思
  • 一个网页账号在多个电脑登录
  • 固定资产不入账的后果
  • 会计监督的基本规定有哪些
  • 企业开办费的会计分录
  • 冲减预交的增值税税率
  • 汽车销售私下收客户红包
  • 电脑运行时cpu温度
  • laravel use
  • windows 11 正式
  • php的api调用方法
  • tkinter美观界面
  • i33240配什么主板
  • 企业之间是什么意思
  • php二维数组foreach
  • php实现文件的下载
  • 小规模纳税人的增值税账务处理
  • 简述php操作mysql数据库的基本步骤
  • 工会经费怎么上缴
  • 转账有手续费没有
  • 发票上多盖了一个发票章
  • 哪种银行贷款利息最低
  • 2、springboot+mybatis+ajax+pageHelper+idea+maven(全套增删改查)
  • rabbitmq work queue
  • phpcms 标签
  • 对公账户怎么查询开户行
  • 增值税主表和附表
  • 接受银行承兑汇票的流程
  • 经营过程中借股怎么处理
  • 捐赠 赞助 区别
  • 发票开错是不是可以作废?
  • 扣除工程款说明
  • 房租押金是什么意思?
  • 发票怎么跨月作废申请
  • 同城票据交换差额户金额从哪得来的
  • 建筑业一般纳税人增值税税负率
  • mysql动态sql语句赋值
  • win10 rs5
  • 怎么把html转换成psd
  • linux calloc
  • windowsxp桌面没有我的电脑
  • linux怎么配置vim
  • 激活 win7
  • pdf在电脑上打开
  • JavaScript程序设计形考答案
  • Node.js Sequelize如何实现数据库的读写分离
  • android动态添加fragment
  • inline-block
  • 基于javascript的毕业设计
  • node转go
  • javascript学习指南
  • 河北省国家税务局电子税务局官网入口
  • 进项发票的税收分类编码怎么查询
  • 合格的税务人
  • 湖北国税网上办税大厅官网
  • 房产税税源编号
  • 金三是什么鱼竿?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设