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

  • 苹果电脑装windows7多少钱(苹果电脑装windows7)(苹果电脑装windows后没声音)

    苹果电脑装windows7多少钱(苹果电脑装windows7)(苹果电脑装windows后没声音)

  • 文件上传失败什么原因(文件上传失败什么原因134)

    文件上传失败什么原因(文件上传失败什么原因134)

  • 爱奇艺扫码登录不见了(爱奇艺扫码登录二维码怎么没了)

    爱奇艺扫码登录不见了(爱奇艺扫码登录二维码怎么没了)

  • 戴尔g3散热怎么解决(戴尔g32020款散热)

    戴尔g3散热怎么解决(戴尔g32020款散热)

  • ios13.5.1适合什么机型(苹果13.5.1系统好用吗?建不建议更新)

    ios13.5.1适合什么机型(苹果13.5.1系统好用吗?建不建议更新)

  • 快手怎么不让别人看到我的赞和关注(快手怎么不让别人看到我点赞的作品)

    快手怎么不让别人看到我的赞和关注(快手怎么不让别人看到我点赞的作品)

  • 新iphone要不要用旧id

    新iphone要不要用旧id

  • 微信正在视频时有新的视频能看到吗(微信正在视频时候录屏没有声音)

    微信正在视频时有新的视频能看到吗(微信正在视频时候录屏没有声音)

  • 2g独显什么水平(mx350 2g独显什么水平)

    2g独显什么水平(mx350 2g独显什么水平)

  • 抖音播放量只有几十个怎么办(抖音播放量只有几十是怎么回事)

    抖音播放量只有几十个怎么办(抖音播放量只有几十是怎么回事)

  • 抖音消息已送达是什么意思(抖音消息已送达但对方收不到)

    抖音消息已送达是什么意思(抖音消息已送达但对方收不到)

  • mate30照相教程(mate30照相如何)

    mate30照相教程(mate30照相如何)

  • oppopact00是什么型号(oppopact00手机报价)

    oppopact00是什么型号(oppopact00手机报价)

  • 格力空调制热外机声音大怎么回事(格力空调制热外机漏水是正常现象吗)

    格力空调制热外机声音大怎么回事(格力空调制热外机漏水是正常现象吗)

  • 苹果手机怎么设置壁纸大小(苹果手机怎么设置壁纸)

    苹果手机怎么设置壁纸大小(苹果手机怎么设置壁纸)

  • 多wan口能当lan口用吗(多wan口路由)

    多wan口能当lan口用吗(多wan口路由)

  • 星标朋友代表什么(星标朋友有什么意义)

    星标朋友代表什么(星标朋友有什么意义)

  • 电容上的数字代表什么(电容数字表示法)

    电容上的数字代表什么(电容数字表示法)

  • 华为p30支持红外遥控吗(华为p30支持红外遥控器吗)

    华为p30支持红外遥控吗(华为p30支持红外遥控器吗)

  • 苹果11首次充电充多久(苹果11首次充电需要关机吗)

    苹果11首次充电充多久(苹果11首次充电需要关机吗)

  • 下单转化率低怎么办(下单转化率低怎么说)

    下单转化率低怎么办(下单转化率低怎么说)

  • 拼多多为什么要拼单(拼多多为什么要填写姓名和身份证号)

    拼多多为什么要拼单(拼多多为什么要填写姓名和身份证号)

  • 荣耀v20怎么升级方舟编译器(荣耀v20怎么升级鸿蒙三)

    荣耀v20怎么升级方舟编译器(荣耀v20怎么升级鸿蒙三)

  • 如何正确安装tenda无线网卡驱动(如何正确安装锯条)

    如何正确安装tenda无线网卡驱动(如何正确安装锯条)

  • 【微信小程序开发】自定义tabBar案例(定制消息99+小红心)(微信小程序开发公司)

    【微信小程序开发】自定义tabBar案例(定制消息99+小红心)(微信小程序开发公司)

  • python中如何获取当前文件的部分信息?(python中如何获取列表中的元素)

    python中如何获取当前文件的部分信息?(python中如何获取列表中的元素)

  • phpcms sso 登录失败怎么办(phpcms v9用户手册)

    phpcms sso 登录失败怎么办(phpcms v9用户手册)

  • 应交税费负数调整到其他流动资产
  • 代扣代缴个人所得税会计分录怎么做
  • 以前年度多缴纳的企业所得税退还
  • 预付款类发票可抵扣吗
  • 个体户查账征收需要交什么税
  • 土地增值税清算方法与技巧
  • 外汇账户包括哪些类型
  • 购买信息技术服务费摘要怎么写
  • 长期投资算资产负债表吗
  • 固定资产一次扣除政策执行到什么时候?
  • 股东费用如何入账
  • 非行政性罚款可以撤销吗
  • 转让无形资产所有权税率
  • 福利性收入属于什么分配
  • 机械租赁有哪些岗位
  • 普通商户怎么开小票
  • 向非关联企业捐赠现金会计分录
  • 会计人士教你在Excel中如何计算年均增长率
  • 广告业务增值税
  • 文化建设事业费按季度申报吗
  • 公司一般户要做账吗
  • 哪些发票冲抵备用金
  • 对外捐赠的账务处理
  • 残疾人保障金是强制性的吗
  • 开出去的发票没有进项发票应怎么核算成本?
  • PHP:pg_field_type_oid()的用法_PostgreSQL函数
  • mysql如果不存在就创建表
  • 期间费用转入本年利润
  • 员工的医药费
  • 男人喜欢什么样的女人最容易动心
  • 增值税的计税依据包括契税吗
  • 高翔ORB-SLAM2稠密建图编译(添加实时彩色点云地图+保存点云地图)
  • wordpress开发app
  • thinkphp ajaxfileupload实现异步上传图片的示例
  • 古罗马广场意大利
  • 经济补偿金个人所得税计算公式
  • 工商年报经营现金净流量计算公式
  • 信用减值损失在借方是增加还是减少
  • tensorflow theano
  • 购买金税盘的费用会计分录
  • mysql5.5命令
  • mongodb查询表数据
  • 农机销售融资贷款流程
  • 积分兑换合适吗
  • 个税年度汇算清缴总结
  • 应收账款的账面价值是什么
  • 固定资产转换为投资性房地产转换日
  • 去年主营业务收入少计
  • 收到上个月退税会计分录
  • 给客户减免的货款怎么做账
  • 污水处理工程内容包括
  • 分期收款定义
  • 进料料件复出可以给第三方吗
  • 商业承兑汇票提示付款流程
  • 坏账准备对资产负债表影响
  • 企业改制后如何脱离原主管部门
  • win8.1所有程序在哪里
  • apache是什么文件
  • win10系统如何禁用触摸板
  • w7定时自动关机
  • 如何设置windows密码
  • win8如何使用网页版的onedrive
  • window10找不到安装的软件
  • win8怎么禁止更新
  • 隐藏网络怎么连接电脑连不上
  • cocoscreator渲染流程图
  • Javascript this 函数深入详解
  • Python selenium爬取table
  • vue2.0与bootstrap3实现列表分页效果
  • python相乘
  • js怎么获取复选框选中的值
  • jquery easyUI中ajax异步校验用户名
  • unity大神
  • 社保银行代扣收费吗
  • 知道纳税人识别号怎么转账
  • 税务登录 河北省地方税务局
  • 购销合同印花税最新政策2023
  • 注册地址和税务登记可以不一致吗
  • 洛阳市房屋契税新政策
  • 盐城国税电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设