
Java中如何构建树结构
发布日期:2021-05-07 11:03:51
浏览次数:8
分类:原创文章
本文共 3273 字,大约阅读时间需要 10 分钟。
前端所示:
后端数据结构如下:
实现方式:
1、表结构如下:
2、添加Treeselect树结构实体工具类
import com.fasterxml.jackson.annotation.JsonInclude;import com.qingteng.soft.business.etm.member.bean.MemberTest;import java.io.Serializable;import java.util.List;import java.util.stream.Collectors;/** * Treeselect树结构实体类 */public class TreeSelect implements Serializable { private static final long serialVersionUID = 1L; /** * 节点ID */ private Long id; /** * 节点名称 */ private String label; /** * 子节点 */ @JsonInclude(JsonInclude.Include.NON_EMPTY) private List<TreeSelect> children; public TreeSelect() { } public TreeSelect(MemberTest dept) { this.id = dept.getPkId(); this.label = dept.getTestName(); this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); }}
3、利用反向工程由数据库表结构生成对应实体类,并在实体类中添加如下字段,并设置对应get和set方法
/** 父名称 */private String parentName;private List<MemberTest> children = new ArrayList<MemberTest>();
4、service中添加如下代码:
public Map<String, Object> treeselect(MemberTest memberTest) { Map<String, Object> map = Maps.newHashMap(); List<MemberTest> memberTests = memberTestServiceImpl.queryAll(memberTest);//查询表中所有数据 List<MemberTest> memberTestTrees = buildTree(memberTests);//构建树结构 List<TreeSelect> collect = memberTestTrees.stream().map(TreeSelect::new).collect(Collectors.toList());//遍历对应的id和label map.put("data",collect); return map; } /** * 构建树结构 */ public List<MemberTest> buildTree(List<MemberTest> memberTests) { List<MemberTest> returnList = Lists.newArrayList(); List<Long> tempList = Lists.newArrayList(); for (MemberTest memberTest : memberTests) { tempList.add(memberTest.getPkId()); } for (Iterator<MemberTest> iterator = memberTests.iterator(); iterator.hasNext(); ) { MemberTest memberTest = iterator.next(); if (!tempList.contains(memberTest.getParentId())) { recursionFn(memberTests, memberTest); returnList.add(memberTest); } } if (returnList.isEmpty()) { returnList = memberTests; } return returnList; } /** * 递归列表 */ private void recursionFn(List<MemberTest> list, MemberTest t) { // 得到子节点列表 List<MemberTest> childList = getChildList(list, t); t.setChildren(childList); for (MemberTest tChild : childList) { if (hasChild(list, tChild)) { recursionFn(list, tChild); } } } /** * 得到子节点列表 */ private List<MemberTest> getChildList(List<MemberTest> list, MemberTest t) { List<MemberTest> tlist = new ArrayList<MemberTest>(); Iterator<MemberTest> it = list.iterator(); while (it.hasNext()) { MemberTest n = (MemberTest) it.next(); if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getPkId().longValue()) { tlist.add(n); } } return tlist; } /** * 判断是否有子节点 */ private boolean hasChild(List<MemberTest> list, MemberTest t) { return getChildList(list, t).size() > 0 ? true : false; }
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年03月22日 03时21分09秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
零基础入门JavaScript 这一篇笔记就够了
2019-03-04
MySQL_安全管理、表单传值、php操作
2019-03-04
BUUCTF web WarmUp
2019-03-04
B1021 个位数统计 (15 分)
2019-03-04
java中的字符串
2019-03-04
Idiot 的间谍网络
2019-03-04
MySql索引及使用、实现的数据结构
2019-03-04
初探SSRF漏洞
2019-03-04
pythonBug入门——从零开始学python
2019-03-04
Vue.js——v-model结合checkbox类型——2020.11.22
2019-03-04
Mybatis核心配置文件--常用标签详解
2019-03-04
R语言练习题答案(3)
2019-03-04
jQuery 事件及动画
2019-03-04
[电影]《Ladybird》演绎完整18岁的青春
2019-03-04
js中[]、{}、()的区别
2019-03-04
js-禁止右键菜单代码、禁止复制粘贴代码
2019-03-04
血色先锋队
2019-03-04
win10系统安装配置Go环境包(第0章)
2019-03-04
搭建samba服务器
2019-03-04