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

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

前言:


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


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


然而,手动构建树形结构往往复杂且繁琐。需要考虑节点的层级关系、递归处理节点和节点列表等问题。为了简化树形结构的构建过程,可以使用一些工具类或库来辅助开发。下面介绍一个名为 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 + "]";
  }
}


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

目录
相关文章
|
4月前
|
运维 Java
Java版HIS系统 云HIS系统 云HIS源码 结构简洁、代码规范易阅读
云HIS系统分为两个大的系统,一个是基层卫生健康云综合管理系统,另一个是基层卫生健康云业务系统。基层卫生健康云综合管理系统由运营商、开发商和监管机构使用,用来进行运营管理、运维管理和综合监管。基层卫生健康云业务系统由基层医院使用,用来支撑医院各类业务运转。
77 5
|
12天前
|
Java 数据处理
技术分享:高效与灵活并存——Java版通用树形结构转换工具的实现与应用
在软件开发中,树形结构的数据表现形式无处不在,从文件系统的目录树到组织架构的部门树,再到各类产品的分类结构。处理这些具有层级关系的数据时,将其转换为树形结构以便展示和操作显得尤为重要。Java作为一门成熟的编程语言,虽然提供了强大的集合框架,但并未直接提供树形结构转换的内置工具。因此,开发一个高效且灵活的通用树形结构转换工具成为许多项目中的必备需求。
23 2
|
30天前
|
IDE Java 测试技术
Python接口自动化测试框架(基础篇)-- 基础语法(真的很基础)
这篇文章是关于Python编程语言的基础语法介绍,包括编码、标识符、注释、行和缩进、输入输出以及导包等基础知识点,旨在帮助初学者理解并掌握Python编程的基础。
17 2
|
2月前
|
存储 Java 应用服务中间件
Java中套路和实现问题之基于组合/模板的套路常见框架中的应用有什么
Java中套路和实现问题之基于组合/模板的套路常见框架中的应用有什么
|
2月前
|
设计模式 缓存 算法
编写高效的Java工具类:实用技巧与设计模式
编写高效的Java工具类:实用技巧与设计模式
|
10月前
|
数据处理
构建高效响应数据:掌握R工具类,轻松驾驭Web开发世界!
构建高效响应数据:掌握R工具类,轻松驾驭Web开发世界!
46 0
|
前端开发 Java
|
存储 Java 测试技术
开发小技巧系列 - Java实现树形结构的方式有那些?
用java代码如何转一个列表的数据,转换成一个树形结构的数据,记录一下,可以帮助一般的开发者
117 0
|
存储 前端开发 安全
Controller层代码技巧,开发人员可以编写出更高效、可维护的代码
Controller层代码技巧,开发人员可以编写出更高效、可维护的代码
146 0
|
前端开发
前端学习案例3-树结构的优点2
前端学习案例3-树结构的优点2
55 0
前端学习案例3-树结构的优点2