Java树状图展示的实现

在项目中经常会遇到将数据以树状图的形式展现出来,如图:

有时候不仅要构建树结构,还要计算每个节点拥有的成员数量.

由于我们不能确定树的大小和层级就不能用常规的方法进行展示,我的解决放入如下,直接上代码:

首先准备实体类:
我已近将构造实体类的方法写在实体类里面了,以后需要构造树形结构的类只要写上自己独有的字段,然后继承这个类,就能直接调用写好的构造树形结构的方法,相当于一个工具类.

/*** ClassName: BaseTreeVo <br/>* Description: <br/>* date: 2022/8/20 12:33<br/>* 构造树形结构的类都应该继承该类** @author 无情的花裤衩<br />*/
@Data
public class BaseTreeVo {@ApiModelProperty(value = "节点id")private Long id;@ApiModelProperty(value = "上级节点的id 上级节点为0时为根节点")private Long superId;@ApiModelProperty(value = "子节点")private List<BaseTreeVo> children;@ApiModelProperty(value = "拥有成员总数量")private Integer memberNum;@ApiModelProperty(value = "直属子成员的id集合")private Set<Long> directlyMemberIds;//这里使用set集合是因为可能会出现一个员工属于多个部门的情况,//防止一个员工被重复计算为多个员工导致数量不准确/*** 计算当前节点拥有成员的总数** @param element 需要计算拥有成员总数量的节点*/public static void countMemberNum(BaseTreeVo element) {Set<Long> memberIds = Sets.newHashSet();if (!CollectionUtils.isEmpty(element.getDirectlyMemberIds())) {memberIds.addAll(element.getDirectlyMemberIds());}memberIds.addAll(getChildrenMemberIds(element.getChildren()));//设置拥有的成员数量element.setMemberNum(memberIds.size());}/*** 获取子节点拥有的全部成员的id集合** @param children 某个节点的全部的子节点* @return 全部子节点拥有成员的id集合*/public static Set<Long> getChildrenMemberIds(List<? extends BaseTreeVo> children) {//全部子节点拥有成员的id集合Set<Long> result = Sets.newHashSet();for (BaseTreeVo child : children) {//没有子节点  这个节点是叶子节点if (CollectionUtils.isEmpty(child.getChildren())) {//设置拥有的成员数量if (CollectionUtils.isEmpty(child.getDirectlyMemberIds())) {child.setMemberNum(0);} else {child.setMemberNum(child.getDirectlyMemberIds().size());result.addAll(child.getDirectlyMemberIds());}} else {//这个节点还有子节点 不是叶子节点Set<Long> childrenMemberIds = getChildrenMemberIds(child.getChildren());if (!CollectionUtils.isEmpty(child.getDirectlyMemberIds())) {childrenMemberIds.addAll(child.getDirectlyMemberIds());}child.setMemberNum(childrenMemberIds.size());result.addAll(childrenMemberIds);}}return result;}/*** 获取根节点* 多个根节点时用这个方法获取根节点** @param elements 全部的需要构建树形结构的元素*/public static List<BaseTreeVo> getRootNodes(List<? extends BaseTreeVo> elements) {List<BaseTreeVo> roots = Lists.newLinkedList();Iterator<? extends BaseTreeVo> iterator = elements.iterator();while (iterator.hasNext()) {BaseTreeVo element = iterator.next();if (element.getSuperId() == 0) {roots.add(element);//将根节点移除 降低以后的循环元素iterator.remove();}}return roots;}/*** 获取根节点* 只有一个根节点时用这个方法** @param elements 全部的需要构建树形结构的元素*/public static BaseTreeVo getRootNode(List<? extends BaseTreeVo> elements) {BaseTreeVo result = null;for (BaseTreeVo element : elements) {if (element.getSuperId() == 0) {//将集合中的根节点移除,减少后续的循环元素的个数elements.remove(element);result = element;return result;}}return null;}/*** 递归,建立子树形结构** @param rootNode 根节点* @param elements 全部的子节点*/public static BaseTreeVo buildTree(BaseTreeVo rootNode, List<? extends BaseTreeVo> elements) {List<BaseTreeVo> children = Lists.newLinkedList();for (BaseTreeVo element : elements) {if (element.getSuperId().equals(rootNode.getId())) {children.add(buildTree(element, elements));}}rootNode.setChildren(children);return rootNode;}
}

使用代码的示例:
表结构:
父子关系是通过superId进行绑定的

需要构造树形结构的类:

/*** 树形展示租户部门列表vo类** @author yanglixin2*/
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(description = "部门树形列表")
public class TenantDepartmentListVo extends BaseTreeVo {@ApiModelProperty(value = "部门名称")private String departmentName;@ApiModelProperty(value = "本级排序")private Integer sort;
}
/*** 树形展示部门列表** @return 部门树形列表*/@Overridepublic TenantDepartmentListVo queryDepartmentList() {//1.查询出全部部门List<TenantDepartment> departmentList = queryDepartmentAllList();List<TenantDepartmentListVo> departmentVoList = Lists.newLinkedList();//将实体类对象转化为视图对象for (TenantDepartment tenantDepartment : departmentList) {TenantDepartmentListVo departmentListVo = BeanHelper.copyProperties(tenantDepartment, TenantDepartmentListVo.class);departmentVoList.add(departmentListVo);}//查询每个部门的直属人员的数量//首先部门的id集合List<Long> departmentIds = departmentVoList.stream().map(BaseTreeVo::getId).collect(Collectors.toList());//通过部门id查询出每个部门拥有的员工idList<TenantDepartmentAccountIdsVo> departmentAccountIds = this.baseMapper.queryDepartmentAccountIds(departmentIds);List<Long> departmentHasAccountIds = departmentAccountIds.stream().map(TenantDepartmentAccountIdsVo::getDepartmentId).collect(Collectors.toList());//给每个部门设置直属账号的id集合for (TenantDepartmentListVo tenantDepartmentListVo : departmentVoList) {if (!departmentHasAccountIds.contains(tenantDepartmentListVo.getId())) {//当前部门没有直属账号tenantDepartmentListVo.setDirectlyMemberIds(null);} else {for (TenantDepartmentAccountIdsVo departmentAccountId : departmentAccountIds) {if (departmentAccountId.getDepartmentId().equals(tenantDepartmentListVo.getId())) {tenantDepartmentListVo.setDirectlyMemberIds(departmentAccountId.getAccountIds());}}}}//2.获取根部门BaseTreeVo rootNode = BaseTreeVo.getRootNode(departmentVoList);if (Objects.isNull(rootNode)) {throw new BusinessException(ErrorDesc.SERVER_ERROR.getDesc());}//3.构建树结构  并将类型转换回来TenantDepartmentListVo resultTree = (TenantDepartmentListVo) BaseTreeVo.buildTree(rootNode, departmentVoList);//4.设置账号总数BaseTreeVo.countMemberNum(resultTree);return resultTree;}

Java树状图展示的实现相关推荐

  1. 【Python 实战基础】如何绘制树状图展示Python数据分析师的知识结构

    目录 一.实战场景 二.主要知识点 文件读写 基础语法 字符串处理 文件生成 数据构建 三.菜鸟实战 1.创建 python 文件 2.运行结果 一.实战场景 实战场景:如何绘制树状图展示Python ...

  2. Tree Map:树状图——绘制COVID-19阵列图

    Tree Map树状图, 可视化 饼状图用于表示每个数据在总体中的占比, 但当数据个体数量较多,规模差异较大时, 饼状图无法很好展现. 树状图是一种通过空间填充占比展示数据比率的可视化方式.能够很好的 ...

  3. zTree(二)树状图下拉框

    需求 添加.修改终端需要选择组织,组织是多级架构(树状图显示). 思路 1.因为下拉框需要树状图显示,所以排除使用select做下拉框,改用input 模拟下拉框 2.树状图采用zTree插件 开工 ...

  4. 递归展示树状图/树状表格

    递归展示树状图 一.数据库表设计 二.后端java递归代码 三.前端展示树状表格 四.效果展示 一.数据库表设计 这里我们采用自关联的设计,通过id和pid的对应来确认数据的上下级关系 建表语句,我这 ...

  5. MATLAB | 全网唯一,使用MATLAB绘制精致的环形树状图

    绘制效果 请叫我平平无奇的绘图天才,这期一次性带来俩工具函数,分别是两层和三层的环形树状图,可以用来展示数据分类和层级: 理顺层级关系属实理得头秃,代码编写不易点个赞叭!! 由于工具函数过长,将被放在 ...

  6. html树状图右侧_树状图及制作方法(Excel 2016/Excel 2013)

    ↑↑↑关注ExcelEasy,让Excel更简单 树状图是一种展示层次结构数据的图表,可以很好的揭示各类别数据的比例关系及类别内数据的组成结构.今天为大家详细介绍一下树状图的制作方法 树状图在Exce ...

  7. 聚类树状图_聚集聚类和树状图-解释

    聚类树状图 Agglomerative Clustering is a type of hierarchical clustering algorithm. It is an unsupervised ...

  8. Pyecharts树状图:地理图表

    Pyecharts树状图:地理图表 文章目录 Pyecharts树状图:地理图表 前言 一.地理图表 1. 基本的国家地图(瑞士) 2. 在地图上展示动态运动效果 3. 分段展示图 4. 省市图 5. ...

  9. 如何在 LaTeX 中画一个树状图(使用tikz和tikz-qtree包中的宏绘制树、森林、二叉树)

    简单介绍 在计算机相关的文章中,树状图是最常见的几种图之一.树状图经常被用来用来演示结构.层次.算法等内容.而二叉树是最基础的树状图之一,掌握二叉树的画法就可以用图像展示一些算法或者数据结构了. 在 ...

最新文章

  1. python【蓝桥杯vip练习题库】ADV-136大数加法(高精度加法)
  2. Eigen: C++开源矩阵计算工具——Eigen的简单用法
  3. Flutter之Decoration(边框、圆角、阴影、形状、渐变、背景图像等)
  4. 【火爆】微软的Holographic会给我们带来什么?Imagine porn with this...
  5. python是什么语言汇编_编程语言及python介绍
  6. sparkStreaming+kafka SparkException: java.nio.channels.ClosedChannelException异常报错
  7. Integer源码解析
  8. Python 面向对象(初级篇)
  9. 标准c语言有几个关键字,C语言有多少个关键字
  10. fatal error LNK1169: one or more multiply defined symbols found
  11. python sendto(右键发送文件到执行的bat)功能的实现
  12. win7从光盘进入修复计算机,win7光盘修复系统步骤
  13. 高铁订票系统设计C语言,数学建模 高铁订票系统建模
  14. 长江大学一键评教项目简要分析
  15. pygame简易超级玛丽制作
  16. echart半圆,特殊半圆
  17. 【Red Team——基础】通过钓鱼攻击获得访问权限
  18. USB Type-C数据线美国新标准UL9990报告检测项目
  19. halcon 图像合成与通道
  20. 单片机并行I/O口(P0)硬件结构

热门文章

  1. mysql 修改数据库字段update_SQL语句update修改数据库字段
  2. apk解包工具 安卓_MT管理器最新2.9.3版支持ROOT后安卓10安卓11文件修改替换
  3. linux可用直播软件,免费直播软件OBS Studio下载 支持Windows/Mac和Linux
  4. Java锁Synchronized对象锁和类锁区别(搬运)
  5. Java霸王的大陆梦幻版_三国志霸王的大陆,喜欢三国的进
  6. 小白电脑选购与组装之配置篇
  7. 2018年Github上值得学习的十个热门项目
  8. [手机分享]黑莓手机8系列分享之——黑莓88XX系列
  9. 子查询(exists子查询)
  10. 解决VScode调试C++文件名不能出现中文的情况