说明:下面用到了lombox插件,和hutool工具包,这两个自行百度

TreeBean.class  用来封装树形结构的实体类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;import java.io.Serializable;
import java.util.List;
import java.util.Map;/***  *  * @projectName vcsrm-parent*  * @title     TreeBean   *  * @package    com.clfps.entity.result  *  * @description    树形结构表类*  * @author IT_CREAT     *  * @date  2019 2019/7/1 13:39  *  * @version V1.0.0 *  */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class TreeBean implements Serializable {private static final long serialVersionUID = 1L;/*id和pid必须赋值,otherParameter装一些其他参数,比如name,key-value键值对的形式*//*将你从数据库查出来的集合循环,然后对每一行数据进行赋值转换成TreeBean结构,调用TreeUtils工具即可得到树形结构列表*/private Long id;//idprivate Long pid;//pidprivate Map<String, Object> otherParameter;//其他参数,需要展示的参数,比如name之类的/*---------------------------------下面这些不需要你赋值-------------------------------------------*/private Boolean hasChildren;//是否含有下一级private List<TreeBean> children;//包含的子节点private Long childrenSize;//子节点的集合大小private Long level;//级别}

TreeUtils.class 用来构造树形结构的工具类

import cn.hutool.core.util.NumberUtil;
import com.xxxx.utils.bean.TreeBean;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/***  *  * @projectName vcsrm-parent*  * @title     TreeUtils   *  * @package    com.clfps.utils  *  * @description    树形结构utils*  * @author IT_CREAT     *  * @date  2019 2019/7/1 15:39  *  * @version V1.0.0 *  */
public class TreeUtils {/*** 使用递归方法建树* @param treeBeans 按规则转换的树形实体集合列表,没有层次结构* @param topId 指定顶级节点id,必须指定* @param topTreeBean 指定顶级节点构造的树形实体,可以传入空值,但是传入空值会将顶级节点的数据去除,返回指定顶级节点的子节点树形结构集合* @return 树形结构实体集合*/public static List<TreeBean> buildByRecursive(List<TreeBean> treeBeans, Long topId ,TreeBean topTreeBean) {List<TreeBean> trees = new ArrayList<>();TreeBean treeBeanTop = null;for (TreeBean treeBean : treeBeans) {if (0 == NumberUtil.compare(treeBean.getPid(),topId)) {Long level = 1L;if(!ObjectUtils.isEmpty(topTreeBean) && 0 == NumberUtil.compare(topTreeBean.getId(), topId)){level = 2L;}TreeBean treeBean2 = findChildren(treeBean,treeBeans,level);if(CollectionUtils.isEmpty(treeBean2.getChildren())){treeBean2.setHasChildren(false);treeBean2.setLevel(level);}else {treeBean2.setHasChildren(true);treeBean2.setLevel(level);treeBean2.setChildrenSize((long) treeBean2.getChildren().size());}trees.add(treeBean2);}else if(!ObjectUtils.isEmpty(topTreeBean) && 0 == NumberUtil.compare(treeBean.getId(), topId)){treeBeanTop = treeBean;}}if(!ObjectUtils.isEmpty(treeBeanTop)){treeBeanTop.setChildren(trees).setChildrenSize((long) trees.size()).setHasChildren(true).setLevel(1L);trees = new ArrayList<>();trees.add(treeBeanTop);}return trees;}/*** 递归查找子节点* @param* @return*/private static TreeBean findChildren(TreeBean treeBean,List<TreeBean> treeBeans,Long level) {for (TreeBean it : treeBeans) {if(0 == NumberUtil.compare(treeBean.getId(), it.getPid())) {if (treeBean.getChildren() == null) {treeBean.setChildren(new ArrayList<>());}TreeBean treeBean2 = findChildren(it,treeBeans,level+1);if(!CollectionUtils.isEmpty(treeBean2.getChildren())){treeBean2.setHasChildren(true);treeBean2.setChildrenSize((long) treeBean.getChildren().size());treeBean2.setLevel(level+1);}else if(treeBean2.getChildren() == null || treeBean2.getChildren().size() == 0){treeBean2.setHasChildren(false);treeBean2.setLevel(level+1);}treeBean.getChildren().add(treeBean2);}}return treeBean;}public static void main(String[] args) {TreeBean treeBean = new TreeBean();treeBean.setId(1L);treeBean.setPid(6000L);
//        treeBean.setLevel(1);Map<String, Object> parameter = new HashMap<>();parameter.put("name", "sadasda");parameter.put("nameEn", "sadasda");parameter.put("namePinyin", "sadasda");parameter.put("code", "sadasda");treeBean.setOtherParameter(parameter);TreeBean treeBean2 = new TreeBean();treeBean2.setId(2L);treeBean2.setPid(6000L);
//        treeBean2.setLevel(1);Map<String, Object> parameter2 = new HashMap<>();parameter.put("name", "sadasda");parameter.put("nameEn", "sadasda");parameter.put("namePinyin", "sadasda");parameter.put("code", "sadasda");treeBean2.setOtherParameter(parameter);TreeBean treeBean3 = new TreeBean();treeBean3.setId(3L);treeBean3.setPid(1L);
//        treeBean3.setLevel(2);Map<String, Object> parameter3 = new HashMap<>();parameter.put("name", "sadasda");parameter.put("nameEn", "sadasda");parameter.put("namePinyin", "sadasda");parameter.put("code", "sadasda");treeBean3.setOtherParameter(parameter);TreeBean treeBean4 = new TreeBean();treeBean4.setId(4L);treeBean4.setPid(1L);
//        treeBean4.setLevel(2);Map<String, Object> parameter4 = new HashMap<>();parameter.put("name", "sadasda");parameter.put("nameEn", "sadasda");parameter.put("namePinyin", "sadasda");parameter.put("code", "sadasda");treeBean4.setOtherParameter(parameter);TreeBean treeBean5 = new TreeBean();treeBean5.setId(5L);treeBean5.setPid(3L);
//        treeBean5.setLevel(3);Map<String, Object> parameter5 = new HashMap<>();parameter.put("name", "sadasda");parameter.put("nameEn", "sadasda");parameter.put("namePinyin", "sadasda");parameter.put("code", "sadasda");treeBean5.setOtherParameter(parameter);List<TreeBean> treeBeans = new ArrayList<>();treeBeans.add(treeBean);treeBeans.add(treeBean2);treeBeans.add(treeBean3);treeBeans.add(treeBean4);treeBeans.add(treeBean5);System.out.println(buildByRecursive(treeBeans,6000L,null));}
}

例子:

表现层:

@ApiOperation("资产分类树形结构")
@PostMapping("/tree")
public JsonResult treeList(Long assetsSortId){if(ObjectUtils.isEmpty(assetsSortId)){assetsSortId = 1L;}//根据传入的资产id查询出包括该资产分类及其子节点分类的集合List<AssetsSort> assetsSortList = assetsSortService.selectAssetsSortList((new AssetsSort()).setAssetsSortId(assetsSortId));List<TreeBean> treeBeans = assetsSortService.buildTree(assetsSortList, assetsSortId);return new JsonResult(treeBeans);
}

业务层:

/*** 树形结构* @param assetsSorts 查询出集合* @param assetsSortId 顶级节点id* @return*/public List<TreeBean> buildTree(List<AssetsSort> assetsSorts,Long assetsSortId) {ArrayList<TreeBean> treeBeans = new ArrayList<>();//将资产分类转换成树形实体的集合List<TreeBean> treeBeans1 = new ArrayList<>();//要返回的树形结构集合if(!CollectionUtils.isEmpty(assetsSorts)){Long topId = 1L;//设置默认顶级节点为1,也就是资产分类id的最顶级为1TreeBean assetsSortBean  =null;//循环资产分类,将资产分类对象转换为树形实体for(AssetsSort assetsSort:assetsSorts){TreeBean treeBean = new TreeBean();treeBean.setId(assetsSort.getAssetsSortId());treeBean.setPid(assetsSort.getParentId());Map<String, Object> parameter = new HashMap<>();parameter.put("assetsSortName", assetsSort.getAssetsSortName());parameter.put("assetsSortNames", assetsSort.getAssetsSortNames());parameter.put("parentIds", assetsSort.getParentIds());parameter.put("createBy", assetsSort.getCreateBy());parameter.put("createTime", ObjectUtils.isEmpty(assetsSort.getCreateTime()) ? "":DateUtils.parseDateToStr("yyyy-MM-dd hh:mm:ss",assetsSort.getCreateTime()));parameter.put("updateBy", assetsSort.getUpdateBy());parameter.put("updateTime", ObjectUtils.isEmpty(assetsSort.getUpdateTime()) ? "":DateUtils.parseDateToStr("yyyy-MM-dd hh:mm:ss",assetsSort.getUpdateTime()));parameter.put("deleteFlag", assetsSort.getDeleteFlag());treeBean.setOtherParameter(parameter);treeBeans.add(treeBean);//将转换成的树形实体添加进集合//拿到顶级节点if ((!ObjectUtils.isEmpty(assetsSortId)&&NumberUtil.compare(assetsSortId,assetsSort.getAssetsSortId())==0)|| NumberUtil.compare(topId,assetsSort.getAssetsSortId())==0){assetsSortBean = treeBean;}}if(!ObjectUtils.isEmpty(assetsSortId)){topId = assetsSortId;//将传入的资产分类id作为顶级节点}//利用工具类构造成树形结构treeBeans1 = TreeUtils.buildByRecursive(treeBeans, topId,assetsSortBean);}return treeBeans1;}

树形结构tree工具类相关推荐

  1. TreeHelper 是一个将含有id,parentId属性的JavaBean转化为层次分明的树形结构的工具类。

    TreeHelper 简介 TreeHelper 是一个将含有id,parentId属性的JavaBean转化为层次分明的树形结构的工具类. 优点 高效树形数据转化 无侵入设计 高性能 通用性强 AP ...

  2. tree工具类 TreeUtils.java

    简介 api 将参数list 构造成 tree getTree(List<Node> list); 源码 import java.util.Collections; import java ...

  3. java ztree json_java 树形转换JSON 工具类 / 树形子父级菜单递归 JSON 格式

    实体类: package tree; import java.util.List; /** * *2018-11-30 */ public class Menu { // 菜单id private S ...

  4. java 树结构_Java通用tree树形结构

    前言 现在大部分都是后端封装树形结构,第一次做的时候想从网上找通用,发现大部分都是要用类的get/set方法,不一样就要改,毕竟懒,改就改改,后来发现部门要,地区要,分类要,于是想着就把之前的用注解和 ...

  5. java 实现树形结构

    实体父类 @Data public class MenuTreeNode<T> {@ApiModelProperty(value = "节点ID")private St ...

  6. 后台数据转树形结构返回前台

    前台向后台请求数据时可能会希望能得到一个树结构的数据结构,方便我们前台获取和使用,也能使得数据结构清晰.这时候需要,后台将数据转化为树形结构.整体思路为: 1. 定义树形结构的实体类 2. 新建工具类 ...

  7. 树形结构递归查询,删除等封装处理

    一. 背景 项目中往往会用到大量的树形结构查询以及删除,通过几个树形结构的操作之后,发现这部分的代码是可以抽象,部分接口是可以做到通过,做好这些,使得类似的操作可以得到简化,下面将讲解具体的操作过程. ...

  8. 总结下各种常见树形结构的定义及特点(二叉树、AVL树、红黑树、Trie树、B树、B+树)

    文章目录 前言 一棵普通的树 相关术语 二叉树 二叉树性质 二叉树特例 二叉查找树 AVL树 特点及应用 红黑树 特点 应用 Trie树 特点及应用 B树 定义及特点 应用 B+树 B+树的优势及应用 ...

  9. 数据库树形结构,EasyUI Tree 树

    通过 $.fn.tree.defaults 重写默认的 defaults. 树(tree)在网页中以树形结构显示分层数据.它向用户提供展开.折叠.拖拽.编辑和异步加载功能. 树的数据格式(Tree D ...

最新文章

  1. Cocos2d:使用 CCCamera 做滚动效果 (Four Ways of Scrolling with Cocos2D)
  2. C2059 语法错误:“)”
  3. Hadoop教程(二):安装
  4. 你以为的并不是你所以为的,《传说之下》Undertale打破游戏的墙
  5. Django视图(一)
  6. stl min函数_std :: min()函数以及C ++ STL中的示例
  7. Cannot determine the location of the VS Common Tools folder.
  8. 深入理解Java中的反射技术
  9. CSS练习_云层效果
  10. 万物皆可Graph | 当信息检索遇上图神经网络
  11. jmeter 获取全部响应,jmeter中的正则表达式提取器-从响应中提取多个值.
  12. 计算机导论课程思政,《计算机导论》课程教学中的思政教育.doc
  13. Ubuntu18.04TLS运行linux版百度网盘客户端的问题
  14. Android11(R) system_ext 分区 system_ext_specific 属性
  15. u-boot-1.1.6源码分析
  16. java myeclipse下载_MyEclipse,myeclipse 8.5 下载,myeclipse官网下载_多特软件站
  17. 定常系统(时不变系统)和时变系统
  18. 自制ADK To Win11PE,加入原生explorer,初步修改注册表(图文1.1万字,很细) (2)
  19. 浏览器功能大比拼:谁更出彩?
  20. (毕业设计资料)基于单片机的水位检测系统仿真设计

热门文章

  1. java爬虫教程 百度云_java视频教程java爬虫实战项目httpclient hbase springmvc solr
  2. 官宣:浙江卫视携手有哇宇宙重磅推出《奔跑吧·共同富裕篇》专属数字藏品,致敬中国新农村建设成就!...
  3. 啊哈C语言,逻辑的挑战
  4. Android V1签名与校验原理分析(全网最全最详细)
  5. 初级会计好考吗?怎么准备考试?
  6. HTML5期末大作业:商城页面——仿优分购电商静态网页(7个页面) HTML+CSS+JavaScript 电商购物网页HTML代码 学生网页课程设计期末作业下载 大学生网页设计制作成...
  7. 某电影网站信息的爬取【干货】
  8. vs code中的platformIO插件,完成Arduino的程序编写,导入,安装开发板管理库
  9. JAVA SpringBoot zip文件夹重命名
  10. elastic-Job配置参数详解