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

  • 微博营销怎样增加粉丝?微营销推广?(如何提升微博营销的效果)

    微博营销怎样增加粉丝?微营销推广?(如何提升微博营销的效果)

  • 网上购票改签一次了还能退吗(网上购票改签一次退票扣多少钱)

    网上购票改签一次了还能退吗(网上购票改签一次退票扣多少钱)

  • 手机上办临时身份证在哪里弄(手机上办临时身份证流程)

    手机上办临时身份证在哪里弄(手机上办临时身份证流程)

  • 蓝奏云怎么注册(蓝奏云怎么注册账号)

    蓝奏云怎么注册(蓝奏云怎么注册账号)

  • 微信如何发超过5分钟的视频(微信如何发超过200的红包)

    微信如何发超过5分钟的视频(微信如何发超过200的红包)

  • qq附近人关注被异常封停(qq附近的人关注你后会看到什么)

    qq附近人关注被异常封停(qq附近的人关注你后会看到什么)

  • 抖音一天发几个作品合适(抖音一天发几个作品最佳几点发布)

    抖音一天发几个作品合适(抖音一天发几个作品最佳几点发布)

  • 华为畅享10s怎么分屏(华为畅享10s怎么隐藏应用)

    华为畅享10s怎么分屏(华为畅享10s怎么隐藏应用)

  • 华为p30pro锁屏步数不显示了(华为P30pro锁屏步数如何关闭)

    华为p30pro锁屏步数不显示了(华为P30pro锁屏步数如何关闭)

  • 5g双模和5g全网通有什么区别(双模5g和全网通5g)

    5g双模和5g全网通有什么区别(双模5g和全网通5g)

  • 显示器overdrive是什么意思(显示器overdrive是关还是开)

    显示器overdrive是什么意思(显示器overdrive是关还是开)

  • 手机录屏在微信上发不出去(手机录屏在微信哪里找)

    手机录屏在微信上发不出去(手机录屏在微信哪里找)

  • 苹果11手机信号差是网络问题还是手机问题(苹果11手机信号差网络差怎么解决)

    苹果11手机信号差是网络问题还是手机问题(苹果11手机信号差网络差怎么解决)

  • 苹果6怎么设置闹钟音乐(苹果6怎么设置自拍不反镜像)

    苹果6怎么设置闹钟音乐(苹果6怎么设置自拍不反镜像)

  • 为什么看直播老是一卡一卡的(为什么看直播老有人关注我)

    为什么看直播老是一卡一卡的(为什么看直播老有人关注我)

  • softap模式是什么意思(soft oa)

    softap模式是什么意思(soft oa)

  • 流量限速怎么解除oppo(流量限速怎么解除黑科技)

    流量限速怎么解除oppo(流量限速怎么解除黑科技)

  • qq解除关系是谁删了谁(qq里什么叫解除关系)

    qq解除关系是谁删了谁(qq里什么叫解除关系)

  • vivo iqoo有耳机插孔么(iqoo5插耳机没用)

    vivo iqoo有耳机插孔么(iqoo5插耳机没用)

  • 安兔兔和鲁大师跑分哪个准(安兔兔和鲁大师哪个准)

    安兔兔和鲁大师跑分哪个准(安兔兔和鲁大师哪个准)

  • 屏幕使用时间怎么关闭(屏幕使用时间怎么删除记录)

    屏幕使用时间怎么关闭(屏幕使用时间怎么删除记录)

  • vivoy3怎么反向无线充电(vivo反向无线充电怎么开启)

    vivoy3怎么反向无线充电(vivo反向无线充电怎么开启)

  • 苹果触控id无法使用(苹果触控id无法使用怎么办)

    苹果触控id无法使用(苹果触控id无法使用怎么办)

  • iconfig.exe进程是什么文件的 iconfig进程查询(icon files)

    iconfig.exe进程是什么文件的 iconfig进程查询(icon files)

  • 暂估入账纳税调整填哪里
  • 建筑施工企业的分公司区域公司等较大的
  • 个人股权激励收入申报
  • 企业法人网上可以注销吗
  • 小规模购买税盘的费用可以抵税吗
  • 冲减存货的会计分录
  • 城市维护建设税税率
  • 固定资产评估减值后如何入账
  • 出售多余材料会计科目
  • 租赁算投资吗
  • 企业长期股权投资中发生的相关费用处理方法正确的有
  • 支付的票据承兑手续费计入财务费用
  • 经营现金流动比率公式
  • 单位员工借款的认定
  • 代账报税软件哪个好
  • 月饼税收分类属于哪一类食品
  • 研发费用没做账怎么调账
  • 固定资产划转要交增值税吗
  • 单位转让专利技巧和方法
  • 小规模计提季度怎么算
  • 个人证券交易结算资金
  • 固定资产折旧率是多少
  • 长租押金多少合适
  • 印花税减半再减半政策文件是什么
  • 金蝶的币别和汇率怎么取消
  • 上月留抵进项抵扣分录
  • 小规模纳税人核定征收标准
  • 选择简易征收
  • 如何弥补以前年假的问题
  • 付不出去的应付账款如何写说明书
  • wordpress使用
  • 工程竣工决算会计账务处理
  • 计算机视觉会议2023年11月
  • 西西弗书店主管级
  • java项目报错
  • 计算机视觉基础知识
  • 从univ.txt文件中去掉机构名称
  • mysql崩溃日志
  • 外管证异地预缴税款是什么意思
  • 白酒贴牌酒是真酒还是假酒
  • 补偿金是否应该上税
  • js怎么存储数据
  • 为什么选择我们公司
  • 增值税不含税销售额填在哪里
  • 收到服务费的增值税发票
  • PostgreSQL教程(十五):系统表详解
  • 企业资金管理是什么意思
  • 偶然所得代扣代缴个人所得税会计分录
  • 工业企业外购存货的实际成本不包括
  • 冲去年管理费用
  • 事业单位的职工可以办营业执照吗
  • 支票存根联丢失可以用回单代替么
  • 个体户为员工缴纳社保
  • 国外佣金算什么费用比较好
  • 低值易耗品意思
  • 电信线路租用费用
  • 作废的发票对方还能认证吗
  • 非流动资产减少
  • 装修公司购买材料,工程施工账务处理会计分录
  • sql server 3417错误
  • windowsxp关闭窗口操作方法有哪些
  • ubuntu的安装包
  • xp系统安装条件
  • linux里cat命令
  • 在pc上安装了hp网络打印机需要注意什么
  • msoobe.exe是什么
  • win7系统怎么隐藏桌面
  • bootstrap treeview 扩展addNode方法动态添加子节点的方法
  • nodejs 视频切片
  • 基于是什么意思
  • 哈希表rehash
  • Activity 的四种启动模式
  • css网页布局方式
  • linux如何批量执行脚本
  • node.js怎么创建js文件
  • js中的substring
  • 重庆市地方税务局公告2016年第2号
  • 深圳税务 qzzn
  • 免除滞纳金的条件
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设