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

  • 小规模忘了报税怎么办
  • 个人独资企业是否享受六税两费政策
  • 申请高新时需要几个项目
  • 预付房租发票未到分录
  • 拍卖土地支付的法律依据
  • 营业外支出计入
  • 公司社保收费标准
  • 免征增值税和营业税政策
  • 一般纳税人17%增值税发票按12%核算如何进行账务处理?
  • 过路费是地税还是国税
  • 小规模 开增值税
  • 津贴补助如何缴纳个税
  • 一般纳税人转出进项税额
  • 租赁合同印花税税率2023
  • 离职补偿金个税计算器2022
  • 水电费没有发票怎么报销
  • 公司购买理财产品计入什么科目
  • 采购审计要点
  • 工程物资期末余额的填列方法
  • 月末税金及附加税金的账务处理
  • 租赁服务可以享受加计抵减吗
  • 库存商品出口退税的账务处理?
  • 土地使用税计税依据及计算方式
  • mac怎么打印文件内容
  • 计提跌价准备会影响利润吗
  • 普票被退回如何处理
  • 企业开票附加税
  • 差额征税通俗理解
  • 绝地求生闪退怎么解决win10
  • 预收账款为什么不属于金融负债
  • php中array怎么用
  • php输入输出
  • 专用发票开具错误
  • 增值税一般纳税人认定标准
  • 体验了一回
  • vue axios.all
  • 记载资金的账簿
  • 银行同业存放业务管理办法
  • 《中华人民共和国民法典》
  • 什么是技术服务工程师
  • 织梦使用手册
  • 织梦怎么用模板建站
  • 发票冲红如何进入系统
  • 简易征收3%的征收率是什么意思
  • 增票普票税率
  • 硬盘录像机开发票属于哪一类
  • 发行股票的好处和坏处
  • 专职独立研发企业是指
  • 医院销售药品是否缴纳增值税
  • 支付稿费怎么做凭证
  • 应交税金减免税科目
  • 内部使用的收据可以做原始凭证吗
  • 员工拿发票报销账务处理
  • 企业应收账款的规模受哪些因素的影响?( )
  • 一般纳税人主表中的25是怎么来的
  • 其他业务收入如何填写增值税申报表
  • 小型便利店靠什么进行营利
  • 建立明细账的注意事项
  • xp磁盘管理打不开
  • winXP运行内存查看
  • ubuntu不支持设置属性
  • linux中使用bash是什么意思
  • 电脑游戏战争策略游戏
  • win7定时静音
  • win10移动版微信uwp
  • jquery上传图片并预览
  • linux中查看命令怎么使用
  • 创建表格在哪里找
  • div自动适应宽度
  • css固定在底部
  • unity3d有什么用
  • Android--VideoPlay--视频播放器
  • androidmvvm框架
  • js跨域的几种方法
  • 加油的电子发票在手机哪里
  • 陕西电子税务局官网
  • 企业内部清欠的措施和做法
  • 湖南省税务举报
  • 逆光代售和神仙代售那个好一点
  • 2020年山东录取人数
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设