Java 构建树型结构

简介: Java 构建树型结构

Java 构建树型结构

常见需求

  1. 菜单导航
  2. 层叠列表
  3. 权限树

构建思路

编写两个POJO: Item、和 创建树型的ItemTree。通过以下过程实现:

  1. 根据标示,获取所有根节点.
  2. 为根节点建立次级节点并拼接上.
  3. 递归为子节点建立次级子树并接上,直至为末端节点拼接上空的“树”

代码

1.ItemMenu 存储每个节点相关的属性
import java.util.List;
/**
 * @author : Jay
 * @description : 节点对象
 * @date : 2021-07-14 09:24
 **/
public class Item {
    /**
     * ID
     */
    private String id;
    /**
     * 父节点ID
     */
    private String parentId;
    /**
     * 节点名称
     */
    private String text;
    /**
     * 子节点集合
     */
    private List<Item> children;
    public Item(String id, String parentId, String text) {
        this.id=id;
        this.parentId=parentId;
        this.text=text;
    }
    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 getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }
    public List<Item> getChildren() {
        return children;
    }
    public void setChildren(List<Item> children) {
        this.children = children;
    }
    @Override
    public String toString() {
        return "Menu{" +
                "id='" + id + '\'' +
                ", parentId='" + parentId + '\'' +
                ", text='" + text + '\'' +
                ", children=" + children +
                '}';
    }
}
2.树, 用于构建树使用的POJO
import java.util.ArrayList;
import java.util.List;
/**
 * @author : Jay
 * @description : 树
 * @date : 2021-07-14 09:27
 **/
public class ItemTree {
    /**
     * 所有菜单集合,构建成树形结构前
     */
    private List<Item> itemList = new ArrayList<Item>();
    public ItemTree(List<Item> itemList) {
        this.itemList = itemList;
    }
    /**
     * 构建树形结构
     */
    public List<Item> buildTree(){
        List<Item> treeItems = new ArrayList<Item>();
        //遍历根节点
        for(Item itemNode : getRootNode()) {
            //递归处理每一个根节点
            itemNode = buildChildTree(itemNode);
            treeItems.add(itemNode);
        }
        return treeItems;
    }
    /**
     * 递归,建立子树形结构
     * @param parentNode 父节点
     * @return 构建后的父节点
     */
    private Item buildChildTree(Item parentNode){
        List<Item> childItems = new  ArrayList<Item>();
        for(Item itemNode : itemList) {
            // 当前节点的父节点ID等于传入的父节点,则放入子节点集合中
            if(itemNode.getParentId().equals(parentNode.getId())) {
                childItems.add(buildChildTree(itemNode));
            }
        }
        parentNode.setChildren(childItems);
        return parentNode;
    }
    /**
     * 获取根节点(父节点ID为0)
     */
    private List<Item> getRootNode() {
        List<Item> rootItemLists = new ArrayList<Item>();
        for(Item itemNode : itemList) {
            //当节点的父节点为0,则为根节点
            if(itemNode.getParentId().equals("0")) {
                rootItemLists.add(itemNode);
            }
        }
        return rootItemLists;
    }
    @Override
    public String toString() {
        return "ItemTree{" +
                "itemList=" + itemList +
                '}';
    }
}
3.测试
import com.alibaba.fastjson.JSONObject;
import java.util.ArrayList;
import java.util.List;
/**
 * @author : Jay
 * @description : 树形结构测试类
 * @date : 2021-07-14 09:58
 **/
public class TreeDemo {
    public static void main(String[] args) {
        List<Item> itemList = new ArrayList<Item>();
        //模拟数据
        itemList.add(new Item("GN001D000","0","系统管理"));
        itemList.add(new Item("GN001D100","GN001D000","权限管理"));
        itemList.add(new Item("GN001D110","GN001D100","密码修改"));
        itemList.add(new Item("GN001D120","GN001D100","新加用户"));
        itemList.add(new Item("GN001D200","GN001D000","系统监控"));
        itemList.add(new Item("GN001D210","GN001D200","在线用户"));
        itemList.add(new Item("GN002D000","0","订阅区"));
        itemList.add(new Item("GN003D000","0","未知领域"));
        //创建树
        ItemTree itemTree = new ItemTree(itemList);
        //构建树
        itemList = itemTree.buildTree();
        String jsonOutput= JSONObject.toJSONString(itemList);
        System.out.println(jsonOutput);
    }
}
4.测试结果
[
    {
        "children":[
            {
                "children":[
                    Object{...},
                    Object{...}
                ],
                "id":"GN001D100",
                "parentId":"GN001D000",
                "text":"权限管理",
                "url":"/admin",
                "yxbz":"Y"
            },
            {
                "children":[
                    {
                        "children":[
                        ],
                        "id":"GN001D210",
                        "parentId":"GN001D200",
                        "text":"在线用户",
                        "url":"/admin",
                        "yxbz":"Y"
                    }
                ],
                "id":"GN001D200",
                "parentId":"GN001D000",
                "text":"系统监控",
                "url":"/admin",
                "yxbz":"Y"
            }
        ],
        "id":"GN001D000",
        "parentId":"0",
        "text":"系统管理",
        "url":"/admin",
        "yxbz":"Y"
    },
    {
        "children":[
        ],
        "id":"GN002D000",
        "parentId":"0",
        "text":"订阅区",
        "url":"/admin",
        "yxbz":"Y"
    },
    {
        "children":[
        ],
        "id":"GN003D000",
        "parentId":"0",
        "text":"未知领域",
        "url":"/admin",
        "yxbz":"Y"
    }
]
5.完成

关注公众号:熊猫Jay字节之旅,了解更多 AI 技巧 ~


相关文章
|
4天前
|
Java 应用服务中间件 开发者
【实战指南】Java Socket编程:构建高效的客户端-服务器通信
【6月更文挑战第21天】Java Socket编程用于构建客户端-服务器通信。`Socket`和`ServerSocket`类分别处理两端的连接。实战案例展示了一个简单的聊天应用,服务器监听端口,接收客户端连接,并使用多线程处理每个客户端消息。客户端连接服务器,发送并接收消息。了解这些基础,加上错误处理和优化,能帮你开始构建高效网络应用。
|
4天前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
16 4
|
12天前
|
网络协议 JavaScript 前端开发
Java一分钟之-GraalVM Native Image:构建原生可执行文件
【6月更文挑战第13天】GraalVM Native Image是Java开发的创新技术,它将应用编译成独立的原生可执行文件,实现快速启动和低内存消耗,对微服务、桌面应用和嵌入式系统有重大影响。本文讨论了如何使用Native Image,包括常见挑战如反射与动态类加载、静态初始化问题和依赖冲突,并提供了解决方案和代码示例。通过合理规划和利用GraalVM工具,开发者可以克服这些问题,充分利用Native Image提升应用性能。
42 5
|
4天前
|
安全 Java 网络安全
Java Socket编程教程:构建安全可靠的客户端-服务器通信
【6月更文挑战第21天】构建安全的Java Socket通信涉及SSL/TLS加密、异常处理和重连策略。示例中,`SecureServer`使用SSLServerSocketFactory创建加密连接,而`ReliableClient`展示异常捕获与自动重连。理解安全意识,如防数据截获和中间人攻击,是首要步骤。通过良好的编程实践,确保网络应用在复杂环境中稳定且安全。
|
2天前
|
前端开发 安全 Java
Java服务器端开发实战:利用Servlet和JSP构建动态网站
【6月更文挑战第23天】**Servlet和JSP在Java Web开发中扮演关键角色。Servlet处理业务逻辑,管理会话,JSP则结合HTML生成动态页面。两者协同工作,形成动态网站的核心。通过Servlet的doGet()方法响应请求,JSP利用嵌入式Java代码创建动态内容。实战中,Servlet处理数据后转发给JSP展示,共同构建高效、稳定的网站。虽然新技术涌现,Servlet与JSP仍为Java Web开发的基石,提供灵活且成熟的解决方案。**
|
2天前
|
前端开发 小程序 Java
深入解析Java Servlet与JSP:构建高效服务器端应用
【6月更文挑战第23天】Java Servlet和JSP是Web开发的关键技术,用于构建高效服务器端应用。Servlet处理HTTP请求,执行业务逻辑,而JSP专注于动态HTML生成。两者结合,借助MVC架构,实现逻辑与视图分离,提高代码可读性和性能。尽管有新框架出现,Servlet和JSP仍是许多项目的基础。
|
4天前
|
算法 Java 机器人
Java数据结构与算法:AVL树
Java数据结构与算法:AVL树
|
1天前
|
缓存 Prometheus 监控
如何使用Java构建高性能、高并发的系统
如何使用Java构建高性能、高并发的系统
|
1天前
|
监控 安全 Java
构建Java版监控系统:从入门到精通
构建Java版监控系统:从入门到精通
5 1
|
11天前
|
存储 安全 Java
深入解析Java HashMap的高性能扩容机制与树化优化
深入解析Java HashMap的高性能扩容机制与树化优化
11 1