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

  • 健康码接龙怎么在微信接龙(健康码接龙怎么在qq接龙)

    健康码接龙怎么在微信接龙(健康码接龙怎么在qq接龙)

  • 华为p40外壳是陶瓷材质的吗(华为p40外壳是什么材质)

    华为p40外壳是陶瓷材质的吗(华为p40外壳是什么材质)

  • 探探为什么改不了年龄(探探为什么改不了照片)

    探探为什么改不了年龄(探探为什么改不了照片)

  • iphone下载qq文件怎么安装(iphone下载qq文件怎么导出)

    iphone下载qq文件怎么安装(iphone下载qq文件怎么导出)

  • 爱奇艺传视频怎么互传(2021最新版爱奇艺怎么传片)

    爱奇艺传视频怎么互传(2021最新版爱奇艺怎么传片)

  • iphone解锁的时候会停顿1秒(iphone解锁的时候屏幕上下跳)

    iphone解锁的时候会停顿1秒(iphone解锁的时候屏幕上下跳)

  • 荣耀x10呼吸灯在哪(荣耀x10max呼吸灯)

    荣耀x10呼吸灯在哪(荣耀x10max呼吸灯)

  • 顺风车没人接单怎么办(为什么滴滴顺风车没人接单)

    顺风车没人接单怎么办(为什么滴滴顺风车没人接单)

  • wps打字总是自动换到下一行怎么办(wps打字自动跳行怎么办)

    wps打字总是自动换到下一行怎么办(wps打字自动跳行怎么办)

  • 钉钉收不到视频会议提醒(钉钉收不到视频邀请)

    钉钉收不到视频会议提醒(钉钉收不到视频邀请)

  • pppoe连接什么意思(pppoe是什么连接)

    pppoe连接什么意思(pppoe是什么连接)

  • 手机qq密保问题设置在哪里(手机qq密保问题设置在哪里修改)

    手机qq密保问题设置在哪里(手机qq密保问题设置在哪里修改)

  • 快手不上热门跟号有关系吗(快手不热门跟WiF有关系吗)

    快手不上热门跟号有关系吗(快手不热门跟WiF有关系吗)

  • 微信朋友圈不能评论是怎么回事(微信朋友圈不能发纯文字)

    微信朋友圈不能评论是怎么回事(微信朋友圈不能发纯文字)

  • 怎样设置软件密码锁(怎样设置软件密码锁 oppo)

    怎样设置软件密码锁(怎样设置软件密码锁 oppo)

  • word表格怎么变成横向(word表格怎么变成excel表格形式)

    word表格怎么变成横向(word表格怎么变成excel表格形式)

  • 电脑文件直接保存在哪里(电脑文件直接保存怎么操作)

    电脑文件直接保存在哪里(电脑文件直接保存怎么操作)

  • iphone xs怎么使用广角(iphonexs怎么使用指纹和面容)

    iphone xs怎么使用广角(iphonexs怎么使用指纹和面容)

  • 拼多多怎么申请开店(拼多多怎么申请开发票)

    拼多多怎么申请开店(拼多多怎么申请开发票)

  • 小米9pro5g支持sa吗(小米9pro5g支持视频输出吗?)

    小米9pro5g支持sa吗(小米9pro5g支持视频输出吗?)

  • 华为手环4怎么连接手机(华为手环4怎么连接oppo手机)

    华为手环4怎么连接手机(华为手环4怎么连接oppo手机)

  • mate305g版上市时间

    mate305g版上市时间

  • 五轴编程需要什么功底(五轴编程难吗)

    五轴编程需要什么功底(五轴编程难吗)

  • windows embedded standard是什么系统(windows embedded standard下载)

    windows embedded standard是什么系统(windows embedded standard下载)

  • 最常见的六种跨域解决方案(跨的基本功有哪些)

    最常见的六种跨域解决方案(跨的基本功有哪些)

  • 税控盘开票软件访问数据库错误
  • 财务软件和报税软件区别
  • 税控盘退费怎么做会计分录
  • 工会筹备金需不需要计提
  • 理事单位和事业单位的区别
  • 小规模纳税人哪些发票可以抵税
  • 住宿税率是多少 5%
  • 预缴企业所得税分录
  • 子公司分红对合并报表的影响
  • 企业理财收入如何确定
  • 折扣销售销售折扣销售折让有何区别
  • 增值税留抵退税政策2022
  • 股权转让交的税如何做账
  • 施工企业暂估成本税前扣除
  • 资产减少应注意的问题有哪些?
  • 未开票确认收入分录怎么做
  • 免费提供客户试用卷的账务处理?
  • 外购材料运输费怎么入账
  • 个体工商户开票金额超过核定了咋办
  • 技术研发费加计扣除政策
  • 关于小规模纳税人的说法错误的有
  • 税控盘维护费抵减分录
  • 财税〔2017〕39号
  • 补交社保如何证明劳动关系
  • 境内企业技术转让 增值税
  • 劳务外包业务外包的区别
  • 出口退税过期了怎么办理
  • 小规模纳税人增值税免税政策
  • 如何查企业是否上市公司
  • Win10电脑重装系统要多少钱
  • 文件夹删除需要管理员权限怎么弄
  • 期间费用属于间接生产费用吗
  • win10设置待机时间长怎么在哪里设置
  • wordpress 中文版和国际版区别
  • 会计科目的设置应该符合国家统一会计准则的规定
  • 摊销专利权会计分录怎么写
  • thinkphp删除数据
  • 搭建小技巧
  • 马塔饰件怎么样
  • 什么是进项票什么是成本票
  • video.js教程
  • 使用二氧化碳灭火器时人应该站在什么位置
  • 节流和防抖js
  • 专利权研发成功的会计分录
  • 应收账款资产负债表负数
  • 织梦相关文章调用
  • 申请个体工商户流程
  • 个人经营所得税率
  • 外购存货的账务处理
  • 可以抵扣的进项发票有哪些
  • 股权收购被收购方怎么做账
  • 存货跌价准备的特点
  • 企业中间投入
  • 应交增值税结转账务处理
  • 电梯折旧率多少
  • 劳务费怎么做会计科目
  • 税金及附加多计提了怎么办
  • 新公司第一次报税需要准备什么
  • 存货过期处理怎么做分录
  • 企业跨年度支出怎么计算
  • 收取客户好处算违法吗
  • 自营工程的账务处理
  • 捐赠利得的会计科目
  • 以前年度损益调整借贷方向
  • 企业如何建账之类的账目
  • xp系统开机后不停重启
  • ubuntu邮箱客户端
  • mac系统怎么查看
  • centos如何安装软件
  • NkbMonitor.exe - NkbMonitor是什么进程文件 有什么作用
  • windows7电脑怎么变快
  • Win10 Mobile 10586.164上手体验视频评测
  • 如何强制和别人qq聊天
  • Ubuntu修改用户名
  • python网络爬虫总结
  • jquer选择器
  • 财政票据和税务票据的法律效力一样吗
  • 北京煤火费2021标准
  • 贵阳市税务局投诉电话号码
  • 湖北低保查询网站官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设