java 构造树形结构_Java构造树形结构数据

本文介绍如何在Java中构建树形结构数据,适用于后端接口与zTree等组件配合使用。通过创建一个基类`NodeHelper`,并让实体类继承它,实现了灵活构造树形结构的功能。示例代码展示了一个`TreeBuilder`类,用于从给定的节点列表构建树形结构,并提供了递归构建子节点的方法。
摘要由CSDN通过智能技术生成

最近遇到一个需要构造树形结构的需求,就是提供给类似zTree组件的后端接口 ,在网上找到一种实现方式,但是博主的实现方式(https://blog.csdn.net/aeaiesb/article/details/40783361),实体类都是Node,我们真实需求中实体类的属性不一定都和博主的相同,那么能不能改造一下呢?下面是改造后的结果。

所有要实现树形结构的实体类继承NodeHelper类

/**

* @Author: gu

* @Date: 2019-09-24 20:54

* @Desc: 树形结构基类

*/

@Data

public class NodeHelper {

public Integer id;

public Integer parentId;

public List extends NodeHelper> child;

}

import com.alibaba.fastjson.JSON;

import com.alibaba.model.base.NodeHelper;

import com.alibaba.test.model.NodeTestVo;

import java.util.ArrayList;

import java.util.List;

/**

* @Author: gu

* @Date: 2019-09-24 19:42

* @Desc: 树形数据构造器

*/

public class TreeBuilder {

List extends NodeHelper> nodes = new ArrayList<>();

public TreeBuilder(List extends NodeHelper> nodes) {

super();

this.nodes = nodes;

}

public static void main(String[] args) {

List nodes = new ArrayList<>();

NodeTestVo p1 = new NodeTestVo(1, 0, "1", "");

NodeTestVo p6 = new NodeTestVo(2, 0, "2", "");

NodeTestVo p7 = new NodeTestVo(201, 2, "201", "");

NodeTestVo p2 = new NodeTestVo(101, 1, "101", "");

NodeTestVo p3 = new NodeTestVo(102, 1, "102", "");

NodeTestVo p4 = new NodeTestVo(10101, 101, "10101", "");

NodeTestVo p5 = new NodeTestVo(10102, 101, "10102", "");

nodes.add(p1);

nodes.add(p2);

nodes.add(p3);

nodes.add(p4);

nodes.add(p5);

nodes.add(p6);

nodes.add(p7);

TreeBuilder treeBuilder = new TreeBuilder(nodes);

List nodeVos = treeBuilder.buildTree();

System.out.println(JSON.toJSONString(nodeVos));

}

/**

* 构建树形结构

*

* @return

*/

public List buildTree() {

List treeNodes = new ArrayList<>();

List rootNodes = getRootNodes();

for (NodeHelper rootNode : rootNodes) {

buildChildNodes(rootNode);

treeNodes.add(rootNode);

}

return treeNodes;

}

/**

* 递归子节点

*

* @param node

*/

public void buildChildNodes(NodeHelper node) {

List children = getChildNodes(node);

if (!children.isEmpty()) {

for (NodeHelper child : children) {

buildChildNodes(child);

}

node.setChild(children);

}

}

/**

* 获取父节点下所有的子节点

*

* @param pnode

* @return

*/

public List getChildNodes(NodeHelper pnode) {

List childNodes = new ArrayList<>();

for (NodeHelper n : nodes) {

if (pnode.getId().equals(n.getParentId())) {

childNodes.add(n);

}

}

return childNodes;

}

/**

* 判断是否为根节点

*

* @param node

* @return

*/

public boolean rootNode(NodeHelper node) {

boolean isRootNode = true;

for (NodeHelper n : nodes) {

if (node.getParentId().equals(n.getId())) {

isRootNode = false;

break;

}

}

return isRootNode;

}

/**

* 获取集合中所有的根节点

*

* @return

*/

public List getRootNodes() {

List rootNodes = new ArrayList<>();

for (NodeHelper n : nodes) {

if (rootNode(n)) {

rootNodes.add(n);

}

}

return rootNodes;

}

}

测试用实体类:

/**

* @Author: gu

* @Date: 2019-09-24 21:05

* @Desc: 树形结构测试类

*/

@Data

public class NodeTestVo extends NodeHelper {

private String text;

private String url;

public NodeTestVo(Integer id, Integer parentId, String text, String url) {

super();

this.id = id;

this.parentId = parentId;

this.text = text;

this.url = url;

}

}

测试结果:

[

{

"child": [

{

"child": [

{

"id": 10101,

"parentId": 101,

"text": "10101",

"url": ""

},

{

"id": 10102,

"parentId": 101,

"text": "10102",

"url": ""

}

],

"id": 101,

"parentId": 1,

"text": "101",

"url": ""

},

{

"id": 102,

"parentId": 1,

"text": "102",

"url": ""

}

],

"id": 1,

"parentId": 0,

"text": "1",

"url": ""

},

{

"child": [

{

"id": 201,

"parentId": 2,

"text": "201",

"url": ""

}

],

"id": 2,

"parentId": 0,

"text": "2",

"url": ""

}

]

Refer:https://blog.csdn.net/aeaiesb/article/details/40783361

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值