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;    }
上一篇:Collections集合中方法的使用
下一篇:跪在一面:字节跳动前端面试8道题,给你心跳的感觉!

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年03月22日 03时21分09秒