2023年6月22日发(作者:)
List转Tree的两种⽅法(⽆递归)前⾔List转Tree的两种⽅法,⼀种是使⽤对象的特性,⽅法极其巧妙,⼀种是使⽤Hutool的⼯具⽅法,对于复杂的结构可能更友好。还要递归也能实现,不过⽹上好多⽅法,这⾥不做赘述,如需要递归⽅法实现请⾃⾏百度。数据准备:⼀批菜单,结构如下:public class AppMenu { //
菜单id private Integer ameId; //
⽗菜单id private Integer parentId; // ..其它字段⽆需理会}⽅法⼀:使⽤Map实现使⽤这个⽅法需要先声明好菜单的树形类,这⾥只加了⼦菜单列表的属性如果需要排序,需要提前对列表进⾏排序public class AppMenuTree extends AppMenuWithBLOBs { List
获取菜单列表 List
根据⽗菜单id进⾏分类 Map
对⼦菜单赋值 for (AppMenuTree childMenu : childMenus) { ld((Id())); } } //
返回根菜单 return (-1);}举例说明对于第2点,这⾥⾮常之巧妙,也不点不好理解,这⾥举例说明⼀下数据准备如下:菜单1(id = 1,parentId = -1)菜单2(id = 2,parentId = 1)菜单3(id = 3,parentId = 2)菜单4(id = 4,parentId = 2)菜单5(id = 5,parentId = 1)根据⽗Id进⾏分类结果,Map的值如下{ {-1,[1]}, {1,[2,5]}, {2,[3,4]}}在遍历时,第⼀次将id为1的菜单的⼦菜单设置为2和5,此时菜单2和5的⼦菜单为空,第⼆次遍历将菜单2的⼦菜单设置为3和4,菜单5的⼦菜单为空,重点来了,这个时候,取出key为-1的菜单,它的值就是最终的结果,原因是菜单的child是引⽤型,第⼀次遍历的时候已经将菜单2的引⽤赋值给了菜单1,第⼆次遍历的时候改变菜单的属性,菜单1⾥的菜单2也会随着变化。⽅法⼆:使⽤Hutool⼯具⽅法实现附上可以在官⽹查看详细使⽤⽅法与其他⼯具⽅法介绍代码实现public List
获取数据 List
构建node列表 List
名称 String name = getMenuFiled(icJson(), "name"); //
排序 Integer sort = 0; try { sort = f(getMenuFiled(endJson(), "sort_number")); } catch (Exception e) { sort = 0; } // TreeNode构造⽅法: public TreeNode(T id, T parentId, String name, Comparable> weight) //
参数:id,⽗id,名称,权重(这⾥传的是sort)值越⼩越在前⾯ TreeNode
拓展字段,类型为Map
构造树,将前⾯的node列表和菜单id传⼊ return (nodeList, -1);}区别⽅法⼀需要⾃⾏声明Tree的类,⽅法⼆可以使⽤Hutool提供的Tree类⽅法⼀需要⾃⼰提前排序,⽅法⼆可以将sort字段传⼊,⾃动排序⽅法⼀只是最原始的转换,⽅法⼆还有更多扩展功能总结个⼈⽐较推荐⽅法⼀,这个原理⾮常巧妙,⽅法⼆只是⼀个使⽤⽅法,如果不去跟踪原理,对⾃⾝的提升有限,如果两种⽅法都掌握,⾃然是最好的⽅法⼆的拓展性较强,后⾯遇到⽐较复杂的结构,⽅法⼆更适合
发布者:admin,转转请注明出处:http://www.yc00.com/news/1687383023a5952.html
评论列表(0条)