当前位置: 首页 > news >正文

有关自连接表的统一封装

表结构

在这里插入图片描述

RecursionBean

@Getter
@Setter
@ToString
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class RecursionBean<T>  extends BaseVO {/*** 编号*/private T id;/*** 父权限ID,根节点的父权限为空* 注释掉@JsonIgnore,是为了前端判断是否是顶级节点,顶级节点才能添加子节点*/
//    @JsonIgnoreprivate T pid;private List<? extends RecursionBean<T>> children;}

封装从服务器端返回的树形数据:RecursionItem

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class RecursionItem<T> extends RecursionBean<T> {/*** 名称*/private String name;public RecursionItem(T id, String name) {super.setId(id);this.name = name;}public RecursionItem(T id, String name, List<? extends RecursionBean<T>> children) {super.setId(id);this.name = name;super.setChildren(children);}
}

工具类

public class RecursionBeanUtil {/*** 递归查询子节点** @param root 根节点* @param list 所有节点* @return 根节点信息*/private static <E, T extends RecursionBean<E>> List<T> getChildren(T root, List<T> list) {final List<T> res = new ArrayList<>();for (T item : list) {if (Objects.equals(item.getPid(), root.getId())) {item.setChildren(getChildren(item, list));res.add(item);}}return res;}public static <E, T extends RecursionBean<E>> List<T> getRecursionList(List<T> list) {if (CollectionUtil.isEmpty(list)) {return list;}// 所有的节点final List<E> allList = list.stream().map(T::getId).toList();// 顶级节点(父ID为空)final List<E> topList = list.stream().filter(item -> item.getPid() == null).map(T::getId).toList();// 父级节点(不包含在已有父级列表中的新PID)final List<E> parentList = list.stream().map(T::getPid).filter(itemPid -> !topList.contains(itemPid)).distinct().toList();// 叶子节点(非顶级且不在父级列表中的节点ID)final List<E> leafList = allList.stream().filter(id -> !topList.contains(id)).filter(id -> !parentList.contains(id)).toList();final List<T> res = new ArrayList<>();boolean topFlag = true;// 如果待处理集合中顶级节点for (T item : list) {if (item.getPid() == null) {topFlag = false;item.setChildren(getChildren(item, list));res.add(item);}}if (!topFlag) {return res;}boolean parentFlag = true;//如果待处理集合中没有顶级节点但有父节点for (T item : list) {// 是父节点但不是叶子节点if (parentList.contains(item.getPid()) && !leafList.contains(item.getId())) {item.setChildren(getChildren(item, list));parentFlag = false;res.add(item);}}if (!parentFlag) {return res;}//如果待处理集合中全部是叶子节点for (T item : list) {// 是父节点但不是叶子节点if (leafList.contains(item.getId())) {item.setChildren(getChildren(item, list));res.add(item);}}return res;}
}

http://www.mrgr.cn/news/43490.html

相关文章:

  • Ray_Tracing_The_Next_Week下
  • 基于Pcap4j收发自定义协议报文(注意事项/踩坑总结)
  • 算法篇1:双指针思想的运用(1)--C++
  • Gitee创建仓库,提交代码到自己的fork,合并到主分支
  • No.4 笔记 | 探索网络安全:揭开Web世界的隐秘防线
  • 【可视化大屏】将柱状图引入到html页面中
  • C++ 异步编程 并发编程技术
  • C语言入门基础题(力扣):完成旅途的最少时间(C语言版)
  • CGLib动态代理和JDK动态代理Demo、ASM技术尝鲜
  • AbMole牛磺胆酸钠在构建大鼠急性胰腺炎模型中的应用
  • 环境可靠性
  • COPS论文总结——Lec17
  • 信息安全工程师(34)访问控制模型
  • 乌班图基础设施安装之Mysql8.0+Redis6.X安装
  • 前端的全栈混合之路Meteor篇(一):运行在浏览器端的数据库-MiniMongo介绍及其前后端数据实时同步示例
  • 数学建模 第四讲 - 数学规划模型
  • Python学习笔记-函数
  • 【网络篇】计算机网络——应用层详述(笔记)
  • Java 网络编程基础
  • 【408计算机考研课程】数据结构-数据结构在学什么?