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

  • 城建税会计分录怎么写
  • 水电费分析小报
  • 商誉在资产负债表中如何体现
  • 预付开发票加油后还能开吗
  • 固定资产盘亏计入什么科目
  • 退货一定要卖家同意吗
  • 季度30万免增值税什么时候结束
  • 存货跌价准备计提原则
  • 企业所得税借款费用
  • 税控软件维护
  • 事业单位劳务派遣工作值得去吗
  • 产品保修发生的维修费计入什么科目
  • 软件研发购买的测试用的设备应该怎么做账?
  • 税金是否可以不计提呢?
  • 增值税税负率计算包含附加税吗
  • 详解劳务报酬个人所得税应该怎么计算?
  • 工程交税需要什么资料
  • 小企业会计准则和企业会计准则的区别
  • 专票什么公司才能开
  • 工资晚发一个月个税怎么申报的
  • 食堂费用没有发票能挂账吗
  • 公司名下的房产出租需要交哪些税
  • 汇算清缴补缴税款分录小企业会计
  • win10内存完整性不兼容的驱动程序
  • 设立全资子公司的风险
  • 如何界定企业的收益
  • 怎么计提企业所得税在哪里知道计提多少
  • 如何修改自己电脑物理地址
  • SUSE Linux Enterprise Server 11 SP3安装教程详解
  • 新成立股份有限公司股本构成
  • 建筑业预缴企业所得税表项目金额填合同金额吗
  • 不合格原材料
  • 哪些可以作为原始凭证
  • 土地增值税清算管理规程
  • 财务费用明细科目怎么写
  • vue-router.esm.js?a12b:2046 Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation
  • 销售金额较大多少算较大
  • 冲回上年计提费用
  • 不得抵扣的增值税怎么处理
  • linux的nano是什么意思
  • 2023年前端开发找工作好找吗
  • php绘图库
  • ps橡皮擦怎么擦的跟背景色一样
  • 对公账号里面的钱会扣税吗
  • python数据编程
  • DedeCMS V5.7 SP2前台文件上传漏洞
  • 微擎框架是开源的吗
  • php首页
  • mysql 触发器
  • 货物搬运费会计科目
  • sql语句批量更新
  • 增值税纳税申报实训报告
  • 工会活动个人奖励标准
  • 注销公司详细步骤
  • 金税盘抵扣的结转会计分录
  • 公对公开税票流程
  • 进项税转出怎么交税
  • 油卡充值做账
  • 债权方的视同购进怎么会计处理?
  • 非限定性净资产 限定性净资产
  • 长期待摊费用是当月摊销还是次月摊销
  • 饭店卖烟酒需要什么手续
  • 劳务派遣人员能有营业执照吗
  • 管理费用业务招待费包括哪些
  • sql server的数据库
  • windows2000怎么安装
  • freebsd更新命令
  • windows10version1909的10累积更新失败
  • win7无法启动print spooler服务,错误5
  • win10系统安装.net framework 3.5
  • win10系统声音怎么打开
  • 塔防类的网游
  • unity android build support
  • jQuery中ajax错误调试分析
  • 基于专业性的家校双向互动,需要家长的学校教育参与
  • 用nodejs做的项目
  • 浅析jQuery Ajax通用js封装
  • 国家税务局总局政策咨询
  • 陕西税务局如何缴纳社保
  • 上海市浦东新区人民医院
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设