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

  • procreate怎么提取线稿(procreate怎么提取照片中的颜色)

    procreate怎么提取线稿(procreate怎么提取照片中的颜色)

  • 小天才的拨号键怎么弄出来(小天才拨号键盘不见了)

    小天才的拨号键怎么弄出来(小天才拨号键盘不见了)

  • 三星s22屏幕尺寸(三星s22屏幕尺寸和苹果)

    三星s22屏幕尺寸(三星s22屏幕尺寸和苹果)

  • 腾讯王卡怎么退订(腾讯王卡怎么退订5g套餐)

    腾讯王卡怎么退订(腾讯王卡怎么退订5g套餐)

  • qq生日怎么设置成农历(qq生日怎么设置成阳历)

    qq生日怎么设置成农历(qq生日怎么设置成阳历)

  • 钉钉办公软件电脑版怎么打卡(钉钉办公软件电脑怎么用)

    钉钉办公软件电脑版怎么打卡(钉钉办公软件电脑怎么用)

  • win7开机ox0000007b蓝屏(Win7开机默认密码)

    win7开机ox0000007b蓝屏(Win7开机默认密码)

  • 华为手机怎么看网速快不快(华为手机怎么看激活时间)

    华为手机怎么看网速快不快(华为手机怎么看激活时间)

  • b站私信频率太高多久恢复(b站私信太频繁)

    b站私信频率太高多久恢复(b站私信太频繁)

  • 抖音画质增强是off还是no(抖音画质增强是什么滤镜)

    抖音画质增强是off还是no(抖音画质增强是什么滤镜)

  • 拼多多5分钟回复率不能低于多少(拼多多5分钟回复)

    拼多多5分钟回复率不能低于多少(拼多多5分钟回复)

  • r9 270x相当于什么n卡(r9270x相当于n卡什么水平)

    r9 270x相当于什么n卡(r9270x相当于n卡什么水平)

  • 快手扣点多少(快手扣点多少钱一个月)

    快手扣点多少(快手扣点多少钱一个月)

  • 微信删除群聊就是退出该群吗(微信删除群聊就退出了吗)

    微信删除群聊就是退出该群吗(微信删除群聊就退出了吗)

  • qq回收站照片永久删了怎么恢复(qq照片回收站里面的照片期限多长)

    qq回收站照片永久删了怎么恢复(qq照片回收站里面的照片期限多长)

  • 什么手机支持红外遥控(什么手机支持红外线功能)

    什么手机支持红外遥控(什么手机支持红外线功能)

  • 网络ap是什么意思(网络ap是什么的缩写)

    网络ap是什么意思(网络ap是什么的缩写)

  • 宽带是什么(宽带是什么意思sm)

    宽带是什么(宽带是什么意思sm)

  • 什么叫群限制搜索(什么叫群限制搜索功能呢)

    什么叫群限制搜索(什么叫群限制搜索功能呢)

  • mac怎么彻底删除搜狗输入法? Mac系统卸载搜狗输入法的两种方法(mac怎么彻底删除一个软件)

    mac怎么彻底删除搜狗输入法? Mac系统卸载搜狗输入法的两种方法(mac怎么彻底删除一个软件)

  • win11快捷方式如何去箭头?win11快捷方式去箭头的方法介绍(win11系统设置快捷键)

    win11快捷方式如何去箭头?win11快捷方式去箭头的方法介绍(win11系统设置快捷键)

  • 【HTML实战】把爱心代码放在自己的网站上是一种什么体验?(怎么把html做成app)

    【HTML实战】把爱心代码放在自己的网站上是一种什么体验?(怎么把html做成app)

  • Dedecms织梦利用memberlist标签调用自定义模型中会员(织梦使用教程)

    Dedecms织梦利用memberlist标签调用自定义模型中会员(织梦使用教程)

  • 资产负债表里的存货包括哪些科目
  • 附加税税负
  • 房地产企业所得税纳税义务发生时间
  • 个人所得税是全部收入吗
  • 增值税发票的品名与报关单不一致
  • 缴纳个人社保在哪里可以缴
  • 开户行为什么是中国建设银行总行
  • 生产成本里面的工资
  • 个税手续费返还计入哪个科目
  • 去外地装修
  • 发票领购带什么
  • 固定资产的维护费计入什么科目
  • 承兑汇票打折支付如何账务处理?
  • 企业所得税申报流程图
  • 税后工资反推税前工资计算方法
  • 手工发票有效期多久
  • 附加税的税率表
  • 固定资产折旧率是多少
  • 需要安装和检验的什么时候确认收入
  • 增值税收入和所得税收入不一致怎么办
  • 实收资本属于会计准则吗
  • 土地增值税的计税依据
  • 库存股的会计科目
  • 折扣销售的定义
  • win7纯净版系统
  • pytorch说明文档
  • 免税怎么开
  • 加德满都治安状况如何
  • 兰萨罗特岛的地理位置
  • Pinia(二)了解和使用Store
  • php获取当前时间提交数据库
  • 使用sm4js进行加密和国密sm4的总结
  • 雪花算法时钟回拨
  • 应收账款科目怎么看
  • lsmod命令结果详解
  • python偏函数理解
  • 产品检测费计入现金流量表什么项目
  • 增值税报销是什么意思
  • 筹建期工会经费怎么算
  • 日主题ripro v8.1破解版(修复缓存器功能)
  • 帝国cms功能
  • php注册系统
  • 机械租赁费税率是多少
  • sql server 2008登录服务器名称
  • 进口产品销售需要交税吗
  • 销售额多少需要纳税
  • 固定资产提取折旧最新规定
  • 增值税纳税申报表附列资料(一)
  • 支付水电费会计
  • 企业租车接送员工上下班
  • 被财政收回的财物有哪些
  • 因员工过失造成的工伤用不用赔
  • 事业单位整体转让
  • 退休人员基本养老金包括哪些
  • 企业的收入总额
  • 进项税和销项税月末怎么结转
  • 对公账户转私人账户有限额吗
  • 建筑业纳税人简易征收偷逃增值税
  • 三证合一后税务怎么办
  • 年底不发工资 员工离职
  • 升级完鸿蒙系统5G咋没有了
  • win8.1资源管理器频繁假死
  • WIN10如何设置字体大小
  • edif是什么文件
  • .exe是啥
  • .exe是什么意思
  • linux修改服务器ip地址
  • 如何设置ie8
  • linuxmint设置中文
  • linux系统入侵检测软件有哪些
  • cocos2dx 3.17
  • iframe语法
  • shell脚本编程实例
  • android 底部选择菜单
  • jQuery Tags Input Plugin(添加/删除标签插件)详解
  • 用jquery
  • 总结网络io模型的特点
  • 注销发票怎么处理流程
  • 山东济南税务局投诉电话
  • 村纪检书记主要工作
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设