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

  • 小规模纳税人收普票和专票有什么区别
  • 增值税计入成本吗?
  • 北京外贸进出口公司
  • 报税怎么操作流程图
  • 缴纳以前年度所得税怎么做分录
  • 应付职工薪酬费用的对应科目
  • 总公司和子公司可以有业务往来吗
  • 原始凭证和记账凭证的作用分别是什么
  • 应收账款项目分析思维导图
  • 准予抵扣的消费税
  • 银行存款一直没动会怎样
  • 专票当月抵扣后当月作废会被发现吗
  • 如何查询当月社保和公积金是否缴纳
  • 含税金是什么意思
  • 技术转让怎么算成本
  • 待清算直销银行
  • 研发费用报表列报
  • 销售成本结转账务处理
  • 银行承兑汇票贴现会计分录
  • 没有成本票怎么做成本
  • 企业在外地的房产怎么办
  • 主营业务成本会计科目使用说明
  • 小规模给个人开普票怎么填写
  • 漏记的账务怎么处理
  • 项目材料验收流程
  • 事业单位工作人员暂行处分办法
  • 欠税,偷税后果严重吗
  • macqq怎么查看删除好友
  • MacOS X Yosemite升级后postgresql启动报错的解决办法
  • dcs是什么文件夹可以删除吗
  • php中split
  • mssearch.exe - mssearch是什么进程 有什么用
  • php反射使用场景
  • 工业企业成本核算会计分录
  • 现金长款怎么做会计分录
  • 公司外部人员的差旅费入什么科目
  • php filesize
  • 隐藏index.html
  • mit?
  • 小规模升级一般纳税人需要多久
  • 汇兑损益是资产类科目
  • 企业和银行对账多久对一次
  • 转出未交增值税借方余额表示什么
  • 其他权益工具投资是金融资产吗
  • page_sql
  • sql server中数据文件的扩展名是
  • 现金溢余涉及的科目
  • 汽车租赁属于有形动产融资租赁服务?
  • PostgreSQL教程(十四):数据库维护
  • 固定资产盘盈为什么计入管理费用
  • 出口退税款计入营业外收入
  • 住房公积金指的是什么意思
  • 本月收入未开票会计分录
  • 预付账款如何调平
  • 银行承兑汇票怎么做账务处理
  • 扶贫差旅费
  • 税金及附加没有设置二级科目,有啥影响吗
  • 公司发放员工工资不走账
  • 企业没有期初数据,会计怎么做账
  • 国库单一账户体系包括哪些账户
  • sql server 判断数据是否存在
  • 经典sql查询语句50条
  • 修改linuxip
  • 电脑出windows
  • 如何创建虚拟硬盘
  • dxva2.dll是什么意思
  • awk中使用sed
  • WIN10系统安装EXCEL打开会报警
  • windows8.1rt
  • unity best fit
  • Android SQLite总结(一)
  • unity协程会阻塞主线程吗
  • node网络爬虫
  • android长按app快捷功能
  • php守护进程的应用场景
  • 详解各种汽油一吨等于多少升
  • javascript:download()
  • 企业代理申报还用自己申报吗
  • 西安大修基金和契税怎么计算
  • 报税卡丢了要怎么处理
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设