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

  • 美的空调如何关闭干燥功能(美的空调如何关闭电辅热功能)

    美的空调如何关闭干燥功能(美的空调如何关闭电辅热功能)

  • 红米电池健康度怎么看(红米电池健康度降到正常)

    红米电池健康度怎么看(红米电池健康度降到正常)

  • 苹果的微信分身在哪下载(苹果的微信分身安全吗)

    苹果的微信分身在哪下载(苹果的微信分身安全吗)

  • 苹果手机如何修改定位位置信息(苹果手机如何修改照片)

    苹果手机如何修改定位位置信息(苹果手机如何修改照片)

  • 苹果se升级ios13后耗电快(苹果se升级15.7.6)

    苹果se升级ios13后耗电快(苹果se升级15.7.6)

  • 华为手机怎么查看软件卸载记录(华为手机怎么查使用了多长时间)

    华为手机怎么查看软件卸载记录(华为手机怎么查使用了多长时间)

  • vivoz5和vivoz5i有什么区别(vivoz5i和哪个手机型号一样)

    vivoz5和vivoz5i有什么区别(vivoz5i和哪个手机型号一样)

  • 笔记本电脑检测不到无线网怎么办(笔记本电脑检测在哪里)

    笔记本电脑检测不到无线网怎么办(笔记本电脑检测在哪里)

  • 小米应用商店wifi不能联网(小米应用商店wifi下载慢)

    小米应用商店wifi不能联网(小米应用商店wifi下载慢)

  • 如何清理qq缓存(如何清理云空间内存)

    如何清理qq缓存(如何清理云空间内存)

  • 蓝牙耳机一只连接不上(蓝牙耳机一只连不上说paring)

    蓝牙耳机一只连接不上(蓝牙耳机一只连不上说paring)

  • oppor11什么时候出来的(oppor11什么时候上市的销量)

    oppor11什么时候出来的(oppor11什么时候上市的销量)

  • 11电池百分比在哪(电池百分比在外面还是里面好)

    11电池百分比在哪(电池百分比在外面还是里面好)

  • 天猫换货没有上门取件吗(天猫换货无货怎样处理)

    天猫换货没有上门取件吗(天猫换货无货怎样处理)

  • 苹果xsmax怎么插双卡(苹果xsmax怎么插电话卡)

    苹果xsmax怎么插双卡(苹果xsmax怎么插电话卡)

  • 抖音私信能看到已读吗(抖音私信能看到对方位置吗)

    抖音私信能看到已读吗(抖音私信能看到对方位置吗)

  • 微信上花呗在哪里打开(微信的花呗在哪儿)

    微信上花呗在哪里打开(微信的花呗在哪儿)

  • 如何扫描图片变成文字(如何扫描图片变成电子版)

    如何扫描图片变成文字(如何扫描图片变成电子版)

  • 小米6是oled屏幕吗(小米6oled屏幕质保)

    小米6是oled屏幕吗(小米6oled屏幕质保)

  • 华为nova 3可以人脸支付吗(华为nova3e支持人脸识别吗)

    华为nova 3可以人脸支付吗(华为nova3e支持人脸识别吗)

  • 美颜相机怎么把字去掉(美颜相机怎么把脸遮住)

    美颜相机怎么把字去掉(美颜相机怎么把脸遮住)

  • Win11新工具:轻轻松松帮你安装任何安卓 APK 应用(windows10轻松使用是什么)

    Win11新工具:轻轻松松帮你安装任何安卓 APK 应用(windows10轻松使用是什么)

  • 织梦模板dedecms列表页隔行/多行随意换色换样式代码(织梦模板首页logo修改)

    织梦模板dedecms列表页隔行/多行随意换色换样式代码(织梦模板首页logo修改)

  • 公对公100万的生意扣税多少
  • 个人所得税租赁费的计算
  • 劳务报酬怎么申报记账凭证
  • 未填开发票怎么作废
  • 劳务费专票数量和单价要写吗
  • 什么合同不需要做结算
  • 公司对公账户限额吗
  • 冲减管理费用是红字还是在贷方
  • 企业年金需要缴纳个人所得税吗
  • 房地产公司扣减土地出让金怎么入账?
  • 付给供应商远期延期支票怎么做账?
  • 网店会计的工作内容是什么
  • 税控盘抵税账务处理
  • 报销车费滴滴怎么打印电子发票
  • 去税务局交的社保能退么
  • 广告制作税收编码怎么填
  • 甲供工程会计分录
  • 进项大于销项怎么做账
  • 代驾费用入什么二级科目
  • 不动产融资租赁服务属于租赁服务吗
  • 购买监控设备费用谁出
  • 怎么更改定位位置信息
  • linux配置ssh免密
  • 亚士顿森林薄雾日出,英国东萨塞克斯郡 (© Tim Stocker Photography/Getty Images)
  • 计提的附加税
  • 谁能代替你啊
  • php微信公众账号是什么
  • 不开票销售收入怎么做账务处理
  • 一般纳税人增值税结转账务处理
  • 纳税申报期和税款所属期的区别
  • 产权转移数据印花
  • 筹办分公司
  • 2022年最新苹果平板电脑
  • 帝国cms自定义列表
  • phpcms生成html
  • mysql 大量数据
  • mysql中游标的作用
  • 做账的好处
  • 从内地到香港坐飞机到国内
  • 什么时候计提增值税发票
  • 境外分回的股息在本国抵免限额怎么算
  • 计提本月短期借款利息500元会计分录
  • 金税盘年服务费账务处理
  • 购买国家机关证件罪量刑标准
  • 有限合伙企业应纳税所得额的计算
  • 员工垫付的费用怎样记账
  • 为什么开发票能抵税?
  • mysql使用入门
  • sql语句示例
  • mysql 5.7.33安装
  • Win7 64位系统没有超级终端软件的解决方法
  • win8.1进入桌面
  • window扫雷游戏在哪里
  • linux的总结
  • kdeskcore.exe是什么
  • windows的服务怎么打开
  • gcasInstallHelper.exe是什么进程 作用是什么 gcasInstallHelper进程查询
  • win8如何使用网页版的onedrive
  • -f linux命令
  • 怎么在win7系统看蓝牙
  • win8.1系统激活
  • 如何禁用ipv6地址
  • Linux下OpenVPN配置静态密钥(static-key)验证教程
  • win8系统多少位
  • perl语言基本命令
  • 打开指定文件夹命令
  • jquery的实现原理
  • jquery弹出div窗口
  • shell操作
  • javascript的代码写在哪里
  • 安卓手机 监听功能
  • js对象的constructor
  • python 连接pg
  • 怎么打印纳税申报表带章的
  • 病历证明在医院保存多久
  • 重庆税务局查询缴费记录
  • 香港买iphone要交多少税
  • 出口退税已提交数据撤回
  • 江苏电子口岸卡邮寄大概需要多久
  • 福建地税网上办事大厅
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设