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

  • 电子缴税付款凭证怎么做账
  • 免税收入是什么票据类型
  • 工资计提金额有误怎么调整
  • 只有增值税专用发票才能勾选抵扣吗
  • 珠宝首饰可以开发票吗
  • 一般纳税人应交增值税怎么算
  • 什么情况下做暂估
  • 向境外销售货物交增值税吗?
  • 固定资产减少会怎么样
  • 订单式生产管理
  • 出售资产时递延所得税怎么处理
  • 物流 贷款
  • 资本公积可以只给一个股东转增资本
  • 员工私人车通行费能抵进项税吗
  • 公司租车税务处理办法
  • 减免税款为什么在借方
  • 增值税发票如何红冲
  • 单位有临时工工资怎么发
  • 增值税降为13
  • 企业大中小型划分最新标准
  • 报关单毛重错了被海关查到
  • 增值税做账做错怎么处理
  • 预收款没有发票怎么入账
  • 提供有形动产租赁服务的增值税税率是
  • 城镇地域
  • 营运资金主要包括什么
  • 自查以前年度补税需调帐吗
  • 筹资费用的含义
  • 进口报关费用会计分录
  • 苹果推送ios15
  • 新购固定资产账务处理
  • 增值税发票半年后能冲红
  • 技术维护费计入
  • 拔缴经费收入
  • 实收资本印花税税率多少
  • python雪花算法生成id
  • 操作系统()
  • 毕业设计2022年幼儿园
  • torch.nn.function
  • 处置固定资产的增值税怎么处理
  • rust 入门教程
  • python编程从入门到精通第三版
  • slf4j、log4j2及logback使用
  • 个体工商户季报还是月报
  • 税负率一般控制什么
  • p f和p a的区别
  • 货物运输业增值税
  • 房产税如何申请减免
  • 变卖固定资产的账务处理
  • 公司债券分为
  • 员工为公司垫费合法吗
  • 事业单位财政直拔工资误填为劳务费怎么写情况说明
  • 报废资产处置账务处理
  • 持有至到期投资账务处理
  • 农产品如何进入批发市场
  • 企业的借款费用有哪些处理方法
  • 汇算清缴退款如何做账
  • 会计记账凭证样本
  • 怎么统计每日产量
  • mysql中排序
  • 在Windows Server 2008中配置FTP服务
  • centos真机安装后只有lo
  • windows查看电池信息
  • win73d设置怎么设置
  • linux crontab -e
  • os x 10.10 yosemite自动纠正怎么关?os x yosemite自动纠正功能关闭教程
  • mac电脑安装软件未受信任
  • 批处理传参数
  • unity开发安卓游戏教程
  • windows安装python pip
  • jquery可以实现哪些效果
  • html里的标签
  • jquery datatable排序
  • 国家税务局关于印花税若干具体问题的规定
  • 文山市税务
  • 公司年会抽奖发言
  • 怎样查看招聘信息
  • 商铺缴纳契税需要复印件吗
  • 财税库银是什么费用
  • 税收筹划可分为
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设