位置: 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万交税
  • 餐饮流水账表格excel
  • 税务安全证书应用客户端
  • 企业一般户怎么注销
  • 母公司及子公司借款要利息吗
  • 利润总额和未分配利润的公式
  • 企业所得税清算报备表清算结束日
  • 增值税期末留抵退税政策实施力度
  • 公司接受投资会计科目
  • 调整以前年度销售费用会计分录
  • 公司之间借钱不还违法吗
  • 用库存物资抵货怎么做账
  • 汇兑还款会计分录
  • 调增应纳税所得额
  • 固定资产暂估入账条件
  • 返利失效了怎么找回
  • 营业外收入个税手续费返还
  • 营改增建筑业税率是多少
  • 公司为员工承担的个税可以税前扣除吗
  • 一般纳税人的兼职合法吗
  • 年度报表申报错误,怎样更正
  • 工业总产值计算方式计算公式
  • 自己盖厂房
  • 营改增后城建税怎么算
  • 应交税费重分类分录
  • 税率调整后合同金额变更案例
  • 加工贸易的方式
  • 经营方式变更说明
  • 企业信息公示社保信息怎么填,公司没有交
  • win10 2004 2009
  • PRISMSTA.EXE - PRISMSTA是什么进程 有什么用
  • 会计档案的保管期限是从什么算起
  • 小规模餐饮企业增值税申报表填写
  • BIOS里没有USB-HDD选项
  • 讲述人功能怎么关闭
  • 外购货物应抵扣的进项税额
  • PHP:pcntl_wifexited()的用法_PCNTL函数
  • php i
  • 本季度企业所得税
  • 合作社分红怎么计算
  • 稽查查补销售额后补开票如何申报
  • 六自由度机器人简图
  • mysql php
  • 独立核算的分公司可以享受小微企业吗
  • 收到汇算清缴后怎么处理
  • 承兑汇票兑现与贴现的区别
  • 土地使用税和房产税怎么申报
  • 基于python语言
  • python如何访问私有方法
  • 怎么盘存货
  • 单位购图书怎么入账
  • 中级会计报名必须满4年吗
  • 房地产开发企业成本核算方法
  • 企业债务重组业务
  • 关于事业支出期末的结转
  • 计提社保公积金的账务处理
  • 借资本公积贷递延所得税负债是什么意思
  • 什么是电子发票如何打印报销
  • 商贸企业的产值和营业收入
  • 研发费用账务处理实例
  • mac外接显示器不显示全部桌面
  • linux设置时间日期
  • internetfeatures.exe是什么文件
  • 怎么用苹果电脑打印照片
  • linux的free
  • ie11forwindows10
  • xp系统如何找到bitlocker
  • mac计算器怎么用
  • w10运行命令在哪
  • win7系统如何查找文件
  • w10qq图标不显示
  • 同步数据和异步数据的区别
  • ExtJS4 组件化编程,动态加载,面向对象,Direct
  • listview点击获取内容
  • 在javascript中如何定义并调用函数
  • android获取meid
  • 山东省国家税务局官网
  • 转卖车位土地增值税税率
  • 增值税与个人的区别
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设