博客
关于我
Java中如何构建树结构
阅读量:329 次
发布时间:2019-03-04

本文共 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;    }

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

你可能感兴趣的文章
全球首个!阿里云开源批流一体机器学习平台Alink……
查看>>
必须要看的网上冲浪安全攻略!
查看>>
红点中国、红杉中国联合领投,WakeData惟客数据完成1000万美元B轮融资
查看>>
看完这篇操作系统,和面试官扯皮就没问题了!
查看>>
OpenStack发布Ussuri版本 实现智能开源基础设施的自动化
查看>>
整理了一份 Docker系统知识,从安装到熟练操作看这篇就够了 | 原力计划
查看>>
2020 AI 产业图谱启动,勾勒中国 AI 技术与行业生态
查看>>
“编程能力差,90%输在了数学上!”CTO:多数程序员都是瞎努力!
查看>>
霍因科技获首届全国信创产业生态创新奖
查看>>
我是程序员,我用这种方式铭记历史
查看>>
F5打造“感知可控,随需而变的应用” 助力企业实现非凡数字体验
查看>>
CSDN湘苗培优|保持热情,告别平庸
查看>>
Serverless 在大规模数据处理中的实践
查看>>
高可用Redis服务架构分析与搭建
查看>>
运营商的互联网蜕变,从沃云平台开始
查看>>
下一次 IT 变革:边缘计算(Edge computing)
查看>>
Gartner的预言:通向混合IT之旅
查看>>
Docker精华问答 | task与executor有什么关系?
查看>>
英特尔强势上新一大波数据产品,小伙伴们“奔走相告”…… | 极客头条
查看>>
成为最大的独立开源公司,对SUSE意味着什么? | 人物志
查看>>