博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA列表转树状结构-列表拼装树状tree,递归,hutool,效率
阅读量:4136 次
发布时间:2019-05-25

本文共 3915 字,大约阅读时间需要 13 分钟。

JAVA树状结构返回方式-列表拼装树状结构,不要整天说不会拼装数据了

第一种:自己写个递归拼装

//定义一个树状结构的类	@Data    static class Column{
private Integer id; private String name; private Integer parentId; private List
children; } public static void main(String[] args) {
Column column1 = new Column(); column1.setId(1); column1.setName("一号栏目"); column1.setParentId(0);//一级栏目设置为0 Column column2 = new Column(); column2.setId(2); column2.setName("二号栏目"); column2.setParentId(0);//一级栏目设置为0 Column column3 = new Column(); column3.setId(3); column3.setName("一号栏目的大儿子"); column3.setParentId(1);//父ID设置为1级栏目 Column column4 = new Column(); column4.setId(4); column4.setName("一号栏目的二儿子"); column4.setParentId(1);//父ID设置为一号栏目 Column column5 = new Column(); column5.setId(5); column5.setName("二号栏目的大儿子"); column5.setParentId(2);//父ID设置为二号栏目 Column column6 = new Column(); column6.setId(6); column6.setName("一号栏目的孙子"); column6.setParentId(4);//父ID设置为一号栏目的二儿子 List
columns = new ArrayList<>(); columns.add(column1); columns.add(column2); columns.add(column3); columns.add(column4); columns.add(column5); columns.add(column6); //我的一级节点是0,此处就传0 List
columnTree = getColumnTree(columns, 0); System.out.println(columnTree); } /** * 递归拼装 * @param sourseColumn * @param id 父节点ID * @return */ private static List
getColumnTree(List
sourseColumn,Integer id){
List
resultColumn = new ArrayList<>(); List
newColumns = new CopyOnWriteArrayList<>(sourseColumn); Safes.of(newColumns).forEach(column -> { if(column.getParentId().equals(id)){ //只要存在过就删除掉,这样递归循环的时候能少循环很多遍 newColumns.remove(column); column.setChildren(getColumnTree(newColumns,column.getId())); resultColumn.add(column); } }); return resultColumn; }

备注1:Safes.of() 方法是一个非空验证工具类,

备注2:使用CopyOnWriteArrayList是为了方便在循环的时候删除数组中的元素,直接remove会空指针

在这里插入图片描述

第二种:使用hutool第三方类库(其实原理也是递归)

1.maven引入

cn.hutool
hutool-all
5.6.7

1.使用

//数据库里面查出来的数据列表,此处还用上文中建的假数据		List
columns = new ArrayList<>(); //固定写法,定义一些属性 TreeNodeConfig treeNodeConfig = new TreeNodeConfig(); // 自定义属性名,默认拼装成功后返回的字段名是id,name,children等,可以自定义修改 // 也可以不配置,根据业务需要来 treeNodeConfig.setIdKey("columnId");//我想把返回的id改成给我返回columnId treeNodeConfig.setNameKey("title");//我想把返回的name字段,改成title treeNodeConfig.setChildrenKey("erZi");//我想把返回的children字段,改成erZi(儿子) treeNodeConfig.setParentIdKey("fatherId");//我想把返回的parentId字段,改成fatherId treeNodeConfig.setWeightKey("menuSort");//返回的对象权重改个名,不改名的话默认是weightKey // 最大递归深度,我这里是两层结构,就写了个2 treeNodeConfig.setDeep(2); //转换器,参数(列表,一级栏目的父ID,treeNodeConfig) List
> treeNodes = TreeUtil.build(columns, "0", treeNodeConfig, (treeNode, tree) -> {
// 固定参数 ,我的示例参数里没有排序字段,就用了ID排序 tree.setId(treeNode.getId().toString()); tree.setParentId(treeNode.getParentId().toString()); tree.setWeight(treeNode.getId()); tree.setName(treeNode.getName()); // 扩展属性 ... (根据业务需要来,需要啥就返回啥,不需要后面就不写) tree.putExtra("suiBian1", treeNode.getName()); tree.putExtra("suiBian2", treeNode.getName()); tree.putExtra("suiBian3", treeNode.getName()); tree.putExtra("xiaXie1", treeNode.getName()); tree.putExtra("xiaXie2", treeNode.getName()); tree.putExtra("xiaXie3", treeNode.getName()); });

在这里插入图片描述

两种方式效率问题

差不多,可以忽略不计

码字不易,我自己手写的,非复制,如果对你有些许帮助,点个赞再走吧。

转载地址:http://vsxvi.baihongyu.com/

你可能感兴趣的文章
7 个适用于所有前端开发人员的很棒API,你需要了解一下
查看>>
25个构建Web项目的HTML建议,你需要了解一下!
查看>>
【web素材】02-10款大气的购物商城网站模板
查看>>
6种方式实现JavaScript数组扁平化(flat)方法的总结
查看>>
如何实现a===1 && a===2 && a===3返回true?
查看>>
49个在工作中常用且容易遗忘的CSS样式清单整理
查看>>
20种在学习编程的同时也可以在线赚钱的方法
查看>>
隐藏搜索框:CSS 动画正反向序列
查看>>
12 个JavaScript 特性技巧你可能从未使用过
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(上)
查看>>
【视频教程】Javascript ES6 教程27—ES6 构建一个Promise
查看>>
【5分钟代码练习】01—导航栏鼠标悬停效果的实现
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(中)
查看>>
8种ES6中扩展运算符的用法
查看>>
【视频教程】Javascript ES6 教程28—ES6 Promise 实例应用
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(下)
查看>>
【web素材】03-24款后台管理系统网站模板
查看>>
Flex 布局教程:语法篇
查看>>
年薪50万+的90后程序员都经历了什么?
查看>>
2019年哪些外快收入可达到2万以上?
查看>>