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 技巧 ~


相关文章
|
16天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
17天前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
37 2
|
27天前
|
存储 算法 Java
🚀Java零基础-顺序结构详解 🚀
【10月更文挑战第11天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
32 6
|
1月前
|
存储 Java 数据库
使用 AuraDB 免费版构建 Java 微服务
使用 AuraDB 免费版构建 Java 微服务
37 11
|
1月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
41 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
1月前
|
前端开发 安全 Java
Java技术深度探索:构建高效稳定的企业级应用
【10月更文挑战第5天】Java技术深度探索:构建高效稳定的企业级应用
25 0
|
1月前
|
前端开发 Java 数据库连接
Java技术深度探索:构建高效稳定的企业级应用
【10月更文挑战第5天】Java技术深度探索:构建高效稳定的企业级应用
27 0
|
2月前
|
Java API 开发者
【Java模块化新飞跃】JDK 22模块化增强:构建更灵活、更可维护的应用架构!
【9月更文挑战第9天】JDK 22的模块化增强为开发者构建更灵活、更可维护的应用架构提供了强有力的支持。通过模块化设计、精细的依赖管理和丰富的工具支持,开发者可以更加高效地开发和管理应用,提高应用的性能和可维护性。
86 10
|
3月前
|
Java
Java应用结构规范问题之在UnitConvertUtils工具类将千米转换为米的问题如何解决
Java应用结构规范问题之在UnitConvertUtils工具类将千米转换为米的问题如何解决
|
3月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决