Java后端返回树型数据

1. 树结构的节点,设置children属性,可嵌套

package com.jiangxb.test.util.tree;

import java.util.ArrayList;
import java.util.List;

/**
 * @author jiangxiangbo
 * @date 2020/8/19
 * @Description: 树结构实体
 */
public class TreeItem {

    private String id;

    private String parentId;

    private String name;

    private List<TreeItem> children = new ArrayList<>();

    public TreeItem(String id, String parentId, String name) {
        this.id = id;
        this.parentId = parentId;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getParentId() {
        return parentId;
    }

    public void setParentId(String parentId) {
        this.parentId = parentId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<TreeItem> getChildren() {
        return children;
    }

    public void setChildren(List<TreeItem> children) {
        this.children = children;
    }

}

2. 生成树的工具类,需要转化的实体要先转为一个个的TreeItem放入List中作为参数。可在实体类中添加toTreeItem方法返回一个TreeItem。

package com.jiangxb.test.util.tree;

import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author jiangxiangbo
 * @date 2020/8/19
 * @Description: 生成树结构的工具类(DCL单例)
 */
public class TreeUtil {

    private volatile static TreeUtil INSTANCE;

    // 构造方法私有化
    private TreeUtil() {

    }

    // 获取树工具单例 (DCL单例)
    public static TreeUtil getInstance() {
        if (INSTANCE == null) {
            synchronized (TreeUtil.class) {
                if (INSTANCE == null) {
                    INSTANCE = new TreeUtil();
                }
            }
        }
        return INSTANCE;
    }

    public TreeItem enquireTree(List<TreeItem> treeItemList) {

        if (treeItemList.isEmpty()) {
            return null;
        }

        // 过滤空对象
        List<TreeItem> treeItems = treeItemList.stream().filter(treeItem -> treeItem != null).collect(Collectors.toList());

        // 存储 id treeItem
        HashMap<String, TreeItem> itemMap = new HashMap<>();
        treeItems.forEach(treeItem -> {
            itemMap.put(treeItem.getId(), treeItem);
        });

        // 声明一个变量存放根节点
        TreeItem root = null;

        // 数据组装
        for (TreeItem treeItem : treeItems) {
            String pid = treeItem.getParentId();
            if (pid.isEmpty() || pid == "0") {
                // 说明该节点为根节点
                root = treeItem;
                continue;
            }
            TreeItem parent = itemMap.get(pid);
            parent.getChildren().add(treeItem);
        }
        return root;
    }

}

3. 测试效果:

package com.jiangxb.test.util.tree;

import com.alibaba.fastjson.JSONObject;
import java.util.Arrays;
import java.util.List;

/**
 * @author jiangxiangbo
 * @date 2020/8/19
 * @Description: TreeItem测试
 */
public class TreeTest {

    public static void main(String[] args) {

        List<TreeItem> treeItemList = Arrays.asList(
            new TreeItem("1", "0", "中国"),
            new TreeItem("10", "1", "河北"),
            new TreeItem("100", "10", "北京"),
            new TreeItem("110", "10", "天津"),
            new TreeItem("20", "1", "河南"),
            new TreeItem("200", "20", "郑州"),
            new TreeItem("210", "20", "洛阳"),
            new TreeItem("220", "20", "许昌"),
            new TreeItem("221", "220", "禹州")
        );

        TreeItem treeItem = TreeUtil.getInstance().enquireTree(treeItemList);

        System.out.println(JSONObject.toJSONString(treeItem));

    }
}

4. 输出(格式化后):

{
    "children": [
        {
            "children": [
                {
                    "children": [
                        
                    ],
                    "name": "北京",
                    "id": "100",
                    "parentId": "10"
                },
                {
                    "children": [
                        
                    ],
                    "name": "天津",
                    "id": "110",
                    "parentId": "10"
                }
            ],
            "name": "河北",
            "id": "10",
            "parentId": "1"
        },
        {
            "children": [
                {
                    "children": [
                        
                    ],
                    "name": "郑州",
                    "id": "200",
                    "parentId": "20"
                },
                {
                    "children": [
                        
                    ],
                    "name": "洛阳",
                    "id": "210",
                    "parentId": "20"
                },
                {
                    "children": [
                        {
                            "children": [
                                
                            ],
                            "name": "禹州",
                            "id": "221",
                            "parentId": "220"
                        }
                    ],
                    "name": "许昌",
                    "id": "220",
                    "parentId": "20"
                }
            ],
            "name": "河南",
            "id": "20",
            "parentId": "1"
        }
    ],
    "name": "中国",
    "id": "1",
    "parentId": "0"
}

 

  • 15
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java GUI中画树型图,您可以使用Java Swing中的JTree组件。 JTree提供了一种方便的方式来表示层次结构数据。以下是一个简单的示例程序,它创建了一个JTree对象并将其添加到一个JFrame中: ```java import javax.swing.JFrame; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; public class TreeExample { public static void main(String[] args) { // 创建根节点 DefaultMutableTreeNode root = new DefaultMutableTreeNode("根节点"); // 创建第一层节点 DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("节点1"); DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("节点2"); DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("节点3"); // 创建第二层节点 DefaultMutableTreeNode node11 = new DefaultMutableTreeNode("节点11"); DefaultMutableTreeNode node12 = new DefaultMutableTreeNode("节点12"); DefaultMutableTreeNode node13 = new DefaultMutableTreeNode("节点13"); // 添加第二层节点到第一层节点上 node1.add(node11); node1.add(node12); node1.add(node13); // 创建第三层节点 DefaultMutableTreeNode node111 = new DefaultMutableTreeNode("节点111"); DefaultMutableTreeNode node112 = new DefaultMutableTreeNode("节点112"); DefaultMutableTreeNode node121 = new DefaultMutableTreeNode("节点121"); // 添加第三层节点到第二层节点上 node11.add(node111); node11.add(node112); node12.add(node121); // 将第一层节点添加到根节点上 root.add(node1); root.add(node2); root.add(node3); // 创建JTree对象 JTree tree = new JTree(root); // 创建JFrame对象并将JTree添加到其中 JFrame frame = new JFrame("树型图"); frame.add(tree); frame.setSize(300, 300); frame.setVisible(true); } } ``` 上面的代码将创建一个包含三层节点的树型图,并且将其显示在一个JFrame中。您可以根据需要修改节点的数量和名称,以创建自己的树形结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值