一些前端框架提供的树形表格需要手动构建树形列表(带children属性的对象数组),这种结构一般是需要在Java后台构建好。

构建的方式是通过id字段与父id字段做关联,通过递归构建children字段来达到构建树形列表的目的。

/**
* 树形表格工具类
*
* @author yanggb
*/
public class TreeTableUtil {/**
* 把列表转换为树结构
*
* @param originalList 原始list数据
* @param idFieldName 作为唯一标示的字段名称
* @param pidFieldName 父节点标识字段名
* @param childrenFieldName 子节点(列表)标识字段名
* @return 树结构列表
*/
public static <T> List<T> list2TreeList(List<T> originalList, String idFieldName, String pidFieldName,
String childrenFieldName) {
// 获取根节点,即找出父节点为空的对象
List<T> rootNodeList = new ArrayList<>();
for (T t : originalList) {
String parentId = null;
try {
parentId = BeanUtils.getProperty(t, pidFieldName);
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
e.printStackTrace();
}
if (StringUtils.isBlank(parentId)) {
rootNodeList.add(0, t);
}
} // 将根节点从原始list移除,减少下次处理数据
originalList.removeAll(rootNodeList); // 递归封装树
try {
packTree(rootNodeList, originalList, idFieldName, pidFieldName, childrenFieldName);
} catch (Exception e) {
e.printStackTrace();
} return rootNodeList;
} /**
* 封装树(向下递归)
*
* @param parentNodeList 要封装为树的父节点对象集合
* @param originalList 原始list数据
* @param keyName 作为唯一标示的字段名称
* @param pidFieldName 父节点标识字段名
* @param childrenFieldName 子节点(列表)标识字段名
*/
private static <T> void packTree(List<T> parentNodeList, List<T> originalList, String keyName,
String pidFieldName, String childrenFieldName) throws Exception {
for (T parentNode : parentNodeList) {
// 找到当前父节点的子节点列表
List<T> children = packChildren(parentNode, originalList, keyName, pidFieldName, childrenFieldName);
if (children.isEmpty()) {
continue;
} // 将当前父节点的子节点从原始list移除,减少下次处理数据
originalList.removeAll(children); // 开始下次递归
packTree(children, originalList, keyName, pidFieldName, childrenFieldName);
}
} /**
* 封装子对象
*
* @param parentNode 父节点对象
* @param originalList 原始list数据
* @param keyName 作为唯一标示的字段名称
* @param pidFieldName 父节点标识字段名
* @param childrenFieldName 子节点(列表)标识字段名
*/
private static <T> List<T> packChildren(T parentNode, List<T> originalList, String keyName, String pidFieldName,
String childrenFieldName) throws Exception {
// 找到当前父节点下的子节点列表
List<T> childNodeList = new ArrayList<>();
String parentId = BeanUtils.getProperty(parentNode, keyName);
for (T t : originalList) {
String childNodeParentId = BeanUtils.getProperty(t, pidFieldName);
if (parentId.equals(childNodeParentId)) {
childNodeList.add(t);
}
} // 将当前父节点下的子节点列表写入到当前父节点下(给子节点列表字段赋值)
if (!childNodeList.isEmpty()) {
FieldUtils.writeDeclaredField(parentNode, childrenFieldName, childNodeList, true);
} return childNodeList;
}
}

直接上代码就好了,我相信秃头的你一定能看得懂。

"这个世界并不在乎你的自尊,只在乎你做出来的成绩,然后再去强调你的感受。"

java构建树形列表(带children属性)的更多相关文章

  1. java构建树形菜单递归工具类

    1.设计菜单实体 import java.util.List; public class Menu { //菜单id private Long id; //父节点id private Long par ...

  2. Winform开发主界面菜单的动态树形列表展示

    我在之前很多文章里面,介绍过Winform主界面的开发,基本上都是标准的界面,在顶部放置工具栏,中间区域则放置多文档的内容,但是在顶部菜单比较多的时候,就需要把菜单分为几级处理,如可以在顶部菜单放置一 ...

  3. 数据库中树形列表(以easyui的tree为例)

    构造一棵easyui前台框架的一个树形列表为例后台框架是spring MVC+JPA. 先看一下数据库是怎么建的,怎么存放的数据 下面是实体类 /** * 部门类 用户所属部门(这里的部门是一个相对抽 ...

  4. 转:最近5年133个Java面试问题列表

    最近5年133个Java面试问题列表 Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试,但是现在问题变得越来 ...

  5. 近5年133个Java面试问题列表

    Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试,但是现在问题变得越来越高级,面试官问的问题也更深入. 在我 ...

  6. Gradle 笔记——Java构建入门

    Gradle是一个通用的构建工具,通过它的构建脚本你可以构建任何你想要实现的东西,不过前提是你需要先写好构建脚本的代码.而大部分的项目,它们的构建流程基本是一样的,我们不必为每一个工程都编写它的构建代 ...

  7. 如何将数据库中存的树转化为树形列表(以easyui的tree为例)

    很多时候,我们会把一棵树存放到数据库中,当前台需要展示一个树形列表时,将这棵树读取出来并显示,这个过程是怎么实现的呢? 这篇文章是以构造一棵easyui前台框架的一个树形列表为例,后台框架是sprin ...

  8. 在Bootstrap开发框架中使用bootstrapTable表格插件和jstree树形列表插件时候,对树列表条件和查询条件的处理

    在我Boostrap框架中,很多地方需要使用bootstrapTable表格插件和jstree树形列表插件来共同构建一个比较常见的查询界面,bootstrapTable表格插件主要用来实现数据的分页和 ...

  9. 最近5年183个Java面试问题列表及答案[最全]

    Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别(String 类型和 StringBuffer 类型的主要性能区别其实在于 Stri ...

随机推荐

  1. eclipse强行停止buliding workspace

    使用Eclipse的过程中可能会遇到buliding workspace卡在一半走不动的情况. 出现这个情况往往是因为Eclipse太调皮了,需要拉出去打屁股,打一顿就好了. 开玩笑的,事实上出现这个 ...

  2. Zabbix 预警问题-预警对应的用户报警媒介收不到

    问题背景 公司现在有这种需求,需要我们对关键的预警发送到对应的项目组负责人,比如 保险项目组的服务器预警大于警告的预警发送到保险负责人的邮箱(也会发送给运维的,背锅逃不掉的). 进行创建一个 用户群组 ...

  3. oracle学习笔记(二十二) REF 动态游标

    动态游标 定义语法 --声明 $cursor_name$ sys_refcursor --打开动态游标 open $cursor_name$ is 查询语句; --关闭游标 close $cursor ...

  4. .NET MVC5简介(四)Filter和AuthorizeAttribute权限验证

    在webform中,验证的流程大致如下图: 在AOP中: 在Filter中: AuthorizeAttribute权限验证 登录后有权限控制,有的页面是需要用户登录才能访问的,需要在访问页面增加一个验 ...

  5. 通过Desktop.ini设置文件夹备注以及图标

    1.新建一个文件夹temp,进入此文件夹,建立desktop.ini文件,编辑内容为: ; 文件夹图标 [.ShellClassInfo] ;设置文件夹的备注 InfoTip=this is temp ...

  6. CSS语法规范一

    CSS语法规范 CSS规则由两个主要的部分构成:选择器以及一条或多条声明. p{ color: red; font-size: 12px; } CSS代码风格 样式格式书写 紧凑格式 h3 {colo ...

  7. 腾讯云游戏服务平台CMatrix品牌全新升级为GameMatrix

    近日,隶属腾讯互娱公共研发运营体系(下文称CROS)下的云游戏服务平台CMatrix宣布进行品牌升级,启用全新商标Tencent GameMatrix,将原先代表云服务的“C”替换成游戏的英文单词“G ...

  8. python : html 调用本地python程序

    <!DOCTYPE html> <html> <head> <meta charset="gb2312"> <title> ...

  9. u盘 安装 centOS 7

    实际上, 对于服务器的安装, 最好是能够远程批量安装(可能有些难度, 不是专业运维) 镜像下载地址: http://59.80.44.49/isoredirect.centos.org/centos/ ...

  10. Django 的admin

    admin使用 Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTALLED_APPS 看到它: # Application ...