轻松编写高效工具类:构建树形结构的秘籍

简介: 轻松编写高效工具类:构建树形结构的秘籍

前言:


在软件开发中,树形结构是一种常见且重要的数据结构。它以树的形式组织数据,其中每个节点可以包含任意数量的子节点。树形结构广泛应用于各个领域,如文件系统、图像处理、网站导航等。


树形结构的主要优势在于能够以递归方式组织和访问数据。它提供了一种直观、灵活的方式来表示层次关系,并且能够高效地执行插入、删除和搜索操作。树形结构对于处理包含父子关系的数据非常有用,它能够轻松地表示层级结构和组织结构,使得数据操作更加方便和高效。


然而,手动构建树形结构往往复杂且繁琐。需要考虑节点的层级关系、递归处理节点和节点列表等问题。为了简化树形结构的构建过程,可以使用一些工具类或库来辅助开发。下面介绍一个名为 BuildTree 的工具类,用于构建树形结构并解决手动构建树形结构的复杂性和繁琐性。


1、BuildTree 工具类的作用和优势:


BuildTree 是一个开发中常用的工具类,用于构建树形结构。它封装了一系列方法,使得构建树形结构变得简单和高效。使用 BuildTree 工具类的优势包括:

  • 简化开发流程:BuildTree 工具类提供了一种简单直观的方式来构建树形结构,不需要手动编写复杂的逻辑。
  • 提高代码可读性和可维护性:通过使用 BuildTree 工具类,代码的意图更加清晰明了,降低了出错的几率,并且简化了后续的维护工作。


2、BuildTree 工具类代码


package com.zking.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BuildTree {
  /**
   * 默认-1为顶级节点
   * @param nodes
   * @param <T>
   * @return
   */
  public static <T> TreeVo<T> build(List<TreeVo<T>> nodes) {
    // 如果节点列表为空,则返回 null
    if (nodes == null) {
      return null;
    }
    // 创建一个空的顶级节点列表
    List<TreeVo<T>> topNodes = new ArrayList<TreeVo<T>>();
    for (TreeVo<T> children : nodes) {
      String pid = children.getParentId();
      // 如果父节点ID为null或者"-1",则将当前节点视为顶级节点,添加到顶级节点列表中
      if (pid == null || "-1".equals(pid)) {
        topNodes.add(children);
        continue;
      }
      // 遍历节点列表,将当前节点添加到对应的父节点的子节点列表中
      for (TreeVo<T> parent : nodes) {
        String id = parent.getId();
        if (id != null && id.equals(pid)) {
          parent.getChildren().add(children);
          children.setHasParent(true);
          parent.setChildren(true);
          continue;
        }
      }
    }
    TreeVo<T> root = new TreeVo<T>();
    // 根据顶级节点列表的大小决定返回结果
    if (topNodes.size() == 1) {
      // 如果顶级节点列表只有一个节点,将其作为根节点返回
      root = topNodes.get(0);
    } else {
      // 如果顶级节点列表为空或包含多个节点,创建一个虚拟的根节点,将顶级节点列表作为其子节点,然后返回根节点
      root.setId("000");
      root.setParentId("-1");
      root.setHasParent(false);
      root.setChildren(true);
      root.setChecked(true);
      root.setChildren(topNodes);
      root.setText("顶级节点");
      Map<String, Object> state = new HashMap<>(16);
      state.put("opened", true);
      root.setState(state);
    }
    return root;
  }
  /**
   * 指定idParam为顶级节点
   * @param nodes
   * @param idParam
   * @param <T>
   * @return
   */
  public static <T> List<TreeVo<T>> buildList(List<TreeVo<T>> nodes, String idParam) {
    // 如果节点列表为空,则返回 null
    if (nodes == null) {
      return null;
    }
    // 创建一个空的顶级节点列表
    List<TreeVo<T>> topNodes = new ArrayList<TreeVo<T>>();
    for (TreeVo<T> children : nodes) {
      String pid = children.getParentId();
      // 如果父节点ID为null或与idParam相等,则将当前节点视为顶级节点,添加到顶级节点列表中
      if (pid == null || idParam.equals(pid)) {
        topNodes.add(children);
        continue;
      }
      // 遍历节点列表,将当前节点添加到对应的父节点的子节点列表中
      for (TreeVo<T> parent : nodes) {
        String id = parent.getId();
        if (id != null && id.equals(pid)) {
          parent.getChildren().add(children);
          children.setHasParent(true);
          parent.setChildren(true);
          continue;
        }
      }
    }
    return topNodes;
  }
}


3、依赖的实体类Treevo


package com.zking.util;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class TreeVo<T> {
  /**
   * 节点ID
   */
  private String id;
  /**
   * 显示节点文本
   */
  private String text;
  /**
   * 节点状态,open closed
   */
  private Map<String, Object> state;
  /**
   * 节点是否被选中 true false
   */
  private boolean checked = false;
  /**
   * 节点属性
   */
  private Map<String, Object> attributes;
  /**
   * 节点的子节点
   */
  private List<TreeVo<T>> children = new ArrayList<TreeVo<T>>();
  /**
   * 父ID
   */
  private String parentId;
  /**
   * 是否有父节点
   */
  private boolean hasParent = false;
  /**
   * 是否有子节点
   */
  private boolean hasChildren = false;
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  public String getText() {
    return text;
  }
  public void setText(String text) {
    this.text = text;
  }
  public Map<String, Object> getState() {
    return state;
  }
  public void setState(Map<String, Object> state) {
    this.state = state;
  }
  public boolean isChecked() {
    return checked;
  }
  public void setChecked(boolean checked) {
    this.checked = checked;
  }
  public Map<String, Object> getAttributes() {
    return attributes;
  }
  public void setAttributes(Map<String, Object> attributes) {
    this.attributes = attributes;
  }
  public List<TreeVo<T>> getChildren() {
    return children;
  }
  public void setChildren(List<TreeVo<T>> children) {
    this.children = children;
  }
  public boolean isHasParent() {
    return hasParent;
  }
  public void setHasParent(boolean isParent) {
    this.hasParent = isParent;
  }
  public boolean isHasChildren() {
    return hasChildren;
  }
  public void setChildren(boolean isChildren) {
    this.hasChildren = isChildren;
  }
  public String getParentId() {
    return parentId;
  }
  public void setParentId(String parentId) {
    this.parentId = parentId;
  }
  public TreeVo(String id, String text, Map<String, Object> state, boolean checked, Map<String, Object> attributes,
                  List<TreeVo<T>> children, boolean isParent, boolean isChildren, String parentID) {
    super();
    this.id = id;
    this.text = text;
    this.state = state;
    this.checked = checked;
    this.attributes = attributes;
    this.children = children;
    this.hasParent = isParent;
    this.hasChildren = isChildren;
    this.parentId = parentID;
  }
  public TreeVo() {
    super();
  }
  @Override
  public String toString() {
    return "TreeVo [id=" + id + ", text=" + text + ", state=" + state + ", checked=" + checked + ", attributes="
        + attributes + ", children=" + children + ", parentId=" + parentId + ", hasParent=" + hasParent
        + ", hasChildren=" + hasChildren + "]";
  }
}


今天的分享就到这里,记得一键三连兄弟们

目录
相关文章
|
缓存 达摩院 Kubernetes
数据缓存系列分享(六):通义千问Qwen-14B大模型快速体验
阿里达摩院近期对通义千问大模型 Qwen-14B 进行了开源(之前开源的是Qwen-7B模型),目前在ModelScope和HuggingFace上均可直接下载。关于Qwen-7B的搭建可以参考我们之前的文章:数据缓存系列分享(五):开源大语言模型通义千问快速体验版,本文将使用一样的方式打开Qwen-14B,快速体验一下。
2027 0
数据缓存系列分享(六):通义千问Qwen-14B大模型快速体验
|
SQL 存储 Oracle
6 张图带你彻底搞懂分布式事务 XA 模式
XA 协议是由 X/Open 组织提出的分布式事务处理规范,主要定义了事务管理器 TM 和局部资源管理器 RM 之间的接口。目前主流的数据库,比如 oracle、DB2 都是支持 XA 协议的。
13636 1
6 张图带你彻底搞懂分布式事务 XA 模式
|
缓存 JavaScript Cloud Native
阿里云发布 Spring Boot 新脚手架,真香
本文,围绕 spring initializr 框架,以 start.spring.io 为例,全面的给大家介绍如何使用和扩展这个框架,以及背后的运行原理。
56722 1
阿里云发布 Spring Boot 新脚手架,真香
|
11月前
|
SQL 数据库 开发者
达梦数据库 【-6111: 字符串转换出错】问题处理
在更新数据库某个值属性时,遇到了“字符串转换出错”的错误。经过分析,发现是由于 `id` 字段实际上是字符串类型而非数值类型导致的。最终通过将 `id` 的值改为字符串类型解决了问题。此问题提醒我们在处理数据库时要仔细检查表结构,不要凭经验臆断字段类型。
|
8月前
|
SQL 关系型数据库 MySQL
MySQL 中的全文索引:强大的文本搜索利器
MySQL 的全文索引是一种用于快速搜索大量文本数据的特殊索引。它通过对文本内容进行分析(如分词、去除停用词等)并构建倒排索引,实现高效查找。创建全文索引使用 `CREATE FULLTEXT INDEX`,搜索时使用 `MATCH AGAINST` 语句。适用于 `CHAR`、`VARCHAR`、`TEXT` 等字段,但需注意性能影响和正确使用搜索语法。
241 22
|
7月前
|
人工智能 自动驾驶 算法
人工智能引发的新文明冲击:未来十年消失的职业!
在21世纪科技浪潮中,人工智能(AI)正以前所未有的速度改变生活方式和工作模式。未来十年内,预计30种传统职业如流水线工人、仓库拣货员、收银员等将逐渐消失,带来前所未有的挑战与机遇。本文探讨这一趋势,分析受影响的职业,并讨论人类如何在AI时代找到新定位。通过GAI认证提升技能,把握AI时代的机遇,共创辉煌未来。
|
设计模式 Java Apache
Springboot项目优化日志logback-spring.xml详解
Commons Logging和Slf4j是日志门面(门面模式是软件工程中常用的一种软件设计模式,也被称为正面模式、外观模式。它为子系统中的一组接口提供一个统一的高层接 口,使 得子系统更容易使用)。log4j和Logback则是具体的日志实现方案。可以简单的理解为接口与接口的实现,调用这只需要关注接口而无需关注具体的实现,做到解耦
2495 0
Springboot项目优化日志logback-spring.xml详解
|
11月前
|
消息中间件 数据库
Seata框架的工作原理
你还可以进一步深入研究 Seata 框架的技术细节和具体实现,以更好地理解其工作原理和优势。同时,结合实际应用场景进行实践和优化,也是提高分布式事务处理能力的重要途径。
468 15
|
12月前
|
SQL JavaScript 数据库连接
Seata的工作原理
【10月更文挑战第30天】
345 3