位置: 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自动亮度怎么设置(苹果13自动亮度调节需要关闭吗)

    苹果13自动亮度怎么设置(苹果13自动亮度调节需要关闭吗)

  • qq音乐会员取消续费在哪里(qq音乐会员取消后下载的歌曲还能听吗)

    qq音乐会员取消续费在哪里(qq音乐会员取消后下载的歌曲还能听吗)

  • 剪映添加音乐怎么调节声音(剪映添加音乐怎么删除前奏部分)

    剪映添加音乐怎么调节声音(剪映添加音乐怎么删除前奏部分)

  • 拼多多直播间在哪里找(拼多多直播间在缅甸源头卖货)

    拼多多直播间在哪里找(拼多多直播间在缅甸源头卖货)

  • 手机能定位找人吗(手机定位找人app可靠吗)

    手机能定位找人吗(手机定位找人app可靠吗)

  • 苹果手机录视频抖动是什么原因(苹果手机录视频怎么美颜拍摄)

    苹果手机录视频抖动是什么原因(苹果手机录视频怎么美颜拍摄)

  • 充电宝在充电的时候可以给手机充电吗(充电宝在充电的时候会爆炸吗)

    充电宝在充电的时候可以给手机充电吗(充电宝在充电的时候会爆炸吗)

  • OPPO手机怎么把截图拼在一起(oppo手机怎么把返回键设置在下边)

    OPPO手机怎么把截图拼在一起(oppo手机怎么把返回键设置在下边)

  • siri是什么手机上的功能(siri是什么手机的智能助理)

    siri是什么手机上的功能(siri是什么手机的智能助理)

  • iphone8动态壁纸不动(iphone8p 动态壁纸)

    iphone8动态壁纸不动(iphone8p 动态壁纸)

  • 怎么取消来电视频播放(如何取消来电视频秀)

    怎么取消来电视频播放(如何取消来电视频秀)

  • 随行wifi有无限流量吗(随行无线网是啥意思)

    随行wifi有无限流量吗(随行无线网是啥意思)

  • 刷机会对手机有什么影响(刷机对手机有影响不)

    刷机会对手机有什么影响(刷机对手机有影响不)

  • 知道qq号怎么查手机号(知道qq号怎么查lol的游戏id)

    知道qq号怎么查手机号(知道qq号怎么查lol的游戏id)

  • ps怎么移动图片位置(ps怎么移动图片到另一张图片)

    ps怎么移动图片位置(ps怎么移动图片到另一张图片)

  • iphone8plus重量多少克(苹果8plus的重量)

    iphone8plus重量多少克(苹果8plus的重量)

  • honor9x有nfc功能吗(honor9xnfc功能在哪里)

    honor9x有nfc功能吗(honor9xnfc功能在哪里)

  • 荣耀8x是双卡双待吗(荣耀8x是不是双卡)

    荣耀8x是双卡双待吗(荣耀8x是不是双卡)

  • 快手8484怎么拍(拍快手怎么拍)

    快手8484怎么拍(拍快手怎么拍)

  • 平面设计有哪几种软件(平面设计有哪几款软件)

    平面设计有哪几种软件(平面设计有哪几款软件)

  • 苹果电量低于20提示怎么关闭(苹果电量低于20弹窗怎么关闭)

    苹果电量低于20提示怎么关闭(苹果电量低于20弹窗怎么关闭)

  • iphone x的信任在哪里(iphonexs信任)

    iphone x的信任在哪里(iphonexs信任)

  • Bios如何禁用光驱、禁用光驱软件、屏蔽光驱软件的选择(如何禁用bios里的secure boot)

    Bios如何禁用光驱、禁用光驱软件、屏蔽光驱软件的选择(如何禁用bios里的secure boot)

  • 学习 Python 之 Pygame 开发魂斗罗(十三)(python怎样学)

    学习 Python 之 Pygame 开发魂斗罗(十三)(python怎样学)

  • php中__destruct方法是什么(php decbin)

    php中__destruct方法是什么(php decbin)

  • 浙江增值税专用发票几个点
  • 广告行业的税负率
  • 外贸 代理
  • 个体工商户要报工商年报吗?
  • 销售部门领用材料用于销售计入
  • 定额怎么确定
  • 消防公司支付劳务费会计处理
  • 代扣代缴境外企业增值税
  • 会计利润包不包括营业外支出
  • 公租房租金收入什么科目
  • 收到第三方利息会计分录
  • 税务部门如何核定税额
  • 建筑企业预交增值税税务筹划案例
  • 保险代理的佣金怎么算
  • 收到保险公司退款
  • 印花税税基含不含增值税
  • 销售已使用过的固定资产增值税
  • 金蝶报告
  • 可供出售金融资产是指什么
  • 分配利润账务处理
  • 发票抵扣后对方恶意冲红
  • 补提以前年度税费应该计入
  • 权益净利率计算公式推导
  • 公司房产税如何计算器
  • 硝铵磷肥的肥效期
  • TP-Link TL-WR841N管理员密码(初始密码)是多少
  • 事业单位福利发放时间
  • 债权人和债务人是什么意思
  • 若依前后端分离需要准备啥
  • awk命令怎么用
  • 汇付的注意事项有哪些内容
  • php数组函数大全
  • php odbc
  • 修改linux启动项
  • 转让居民企业的股权所得交企业所得税吗
  • php echo语句
  • 人工智能课程心得体会
  • 资产证券化 会计处理
  • 制造业工资计提
  • 生产车间工资计提
  • 如何做架构规划图
  • 小程序设计制作
  • mess指令
  • 取得抵债资产支付的税费一般不包括下列哪种
  • 抵债资产怎么入账
  • 尚未抄税无法申报
  • 公司不按股权比例分红是否合法
  • 差额征税好吗
  • 乡村道路属于城市道路吗
  • 应收账款未计提坏账能直接核销
  • 劳务总价包干
  • 什么叫递延收益和其他收益
  • 滴滴打车老板起源故事
  • 增值税发票未认证丢失怎么办
  • 负债类科目分录
  • 有偿服务职工怎么办
  • 未达起征点的收入怎么入账
  • 帐簿的保管期限
  • mysql日志记录
  • Mac如何使用clash上外网
  • centos6.5mini安装教程
  • win8电脑触摸屏没反应怎么办
  • 如何修改windows默认语言
  • 怎么看win8还是win10
  • win8右边栏设置
  • Win7摄像头驱动程序
  • jquerycuishifeng
  • jQuery的ajax中使用FormData实现页面无刷新上传功能
  • python数据结构教程
  • python怎么生成随机函数
  • 如何分析源码
  • python自动化源码
  • jquery $each
  • 深圳天然气收费价格表
  • 地税登记证编号是哪几位
  • 广东税务实名注册
  • 湖北省地方税务局公告2014年第7号
  • 北京市东城分局刑侦大队电话
  • 跨县调动工作流程
  • 2017企业所得税年度申报表
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设