Java利用递归实现树形结构的工具类

yizhihongxing

Java利用递归实现树形结构的工具类攻略

简述

树形结构在程序中非常常见,而递归是树形结构处理最基本的方法。因此,利用递归实现树形结构的工具类也是非常有用的。

本攻略将介绍如何使用Java语言利用递归实现树形结构的工具类,包括实现方法及其应用。

实现方法

以下为Java实现树形结构的工具类的核心代码:

public class TreeUtil {
    /**
     * 将列表转化为树形结构
     *
     * @param list 列表数据
     * @param pid  父节点ID
     * @return 树形结构数据
     */
    public static <T extends TreeNode<T>> List<T> buildTree(List<T> list, Object pid) {
        List<T> trees = new ArrayList<>();
        list.forEach(t -> {
            if (pid.equals(t.getParentId())) {
                trees.add(findChildren(t, list));
            }
        });
        return trees;
    }

    /**
     * 递归查找子节点
     *
     * @param tree 节点
     * @param list 列表数据
     * @return 树形结构的节点
     */
    public static <T extends TreeNode<T>> T findChildren(T tree, List<T> list) {
        list.forEach(t -> {
            if (tree.getId().equals(t.getParentId())) {
                if (tree.getChildren() == null) {
                    tree.setChildren(new ArrayList<>());
                }
                tree.getChildren().add(findChildren(t, list));
            }
        });
        return tree;
    }
}

TreeNode是节点的实体类,具体实现如下:

public class TreeNode<T> {
    private Object id;
    private Object parentId;
    private List<T> children;

    // Getters and Setters
}

如上所述,该工具类主要包含以下两个方法:

  1. buildTree:将列表转化为树形结构;
  2. findChildren:递归查找子节点。

其中,buildTree方法的具体实现为:

  • 遍历列表,如果某个节点的ParentId等于传入的pid,则将该节点及其所有子节点加入到树形结构中。

findChildren方法的具体实现为:

  • 遍历列表,如果某个节点的ParentId等于传入的节点的id,则递归查找该节点的子节点,并将该节点及其所有子节点加入到树形结构中。

应用示例

这里给出两个树形结构操作的示例:

  1. 给出如下的树形结构:
[
    {"id": 1, "parentId": null},
    {"id": 2, "parentId": 1},
    {"id": 3, "parentId": 2},
    {"id": 5, "parentId": 1}
]

使用TreeUtil工具类将其转化为树形结构:

public class Test {
    public static void main(String[] args) {
        List<TreeNode> treeNodeList = new ArrayList<>();
        treeNodeList.add(new TreeNode(1L, null));
        treeNodeList.add(new TreeNode(2L, 1L));
        treeNodeList.add(new TreeNode(3L, 2L));
        treeNodeList.add(new TreeNode(5L, 1L));
        List<TreeNode> treeList = TreeUtil.buildTree(treeNodeList, null);
        System.out.println(JSON.toJSONString(treeList));
    }
}

转化后的树形结构:

[
    {
        "id": 1,
        "parentId": null,
        "children": [
            {
                "id": 2,
                "parentId": 1,
                "children": [
                    {
                        "id": 3,
                        "parentId": 2,
                        "children": []
                    }
                ]
            },
            {
                "id": 5,
                "parentId": 1,
                "children": []
            }
        ]
    }
]
  1. 给出如下的树形结构:
[
    {"id": 1, "parentId": null},
    {"id": 2, "parentId": 1},
    {"id": 3, "parentId": 2},
    {"id": 5, "parentId": 1},
    {"id": 7, "parentId": 8},
    {"id": 8, "parentId": null}
]

使用TreeUtil工具类查找id为2的节点的所有子节点:

public class Test {
    public static void main(String[] args) {
        List<TreeNode> treeNodeList = new ArrayList<>();
        treeNodeList.add(new TreeNode(1L, null));
        treeNodeList.add(new TreeNode(2L, 1L));
        treeNodeList.add(new TreeNode(3L, 2L));
        treeNodeList.add(new TreeNode(5L, 1L));
        treeNodeList.add(new TreeNode(7L, 8L));
        treeNodeList.add(new TreeNode(8L, null));
        TreeNode node = new TreeNode(2L, 1L);
        TreeNode result = TreeUtil.findChildren(node, treeNodeList);
        System.out.println(JSON.toJSONString(result.getChildren()));
    }
}

查找后的结果:

[
    {
        "id": 3,
        "parentId": 2,
        "children": []
    }
]

总结

通过上述介绍,我们可以看到,使用Java语言利用递归实现树形结构的工具类可以大大方便我们对树形数据的处理。通过TreeUtil工具类的两个核心方法,我们可以将列表数据转化为树形结构,也可以实现根据指定节点查找子节点的操作,极大地方便了程序开发。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java利用递归实现树形结构的工具类 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • c中的fseek函数使用

    C中的fseek函数使用 在C语言中,访问文件是很常见的操作,而文件通常是一段连续的字节流。为了向前或向后读取文件的数据,我们就需要通过控制文件的指针来实现了。为了方便管理文件指针,C标准库提供了fseek函数,可以实现文件指针的定位和控制。 fseek函数的语法 fseek函数的语法如下: int fseek(FILE *stream, long int …

    其他 2023年3月29日
    00
  • jshidden属性

    当然,我可以为您提供详细的“jshidden属性”的完整攻略,包括两个示例说明。 jshidden属性 在HTML中,jshidden属性用于隐藏元素使其在页面上不可见。在本教程中,将介绍jshidden属性的用法和示例。 语法 jshidden属性语法如下: <div jshidden></div> 示例 以下是两个示例,说明如何在…

    other 2023年5月7日
    00
  • android中用studio更改包名

    Android中用Studio更改包名 在Android开发中,我们经常需要更改应用程序的包名(Package Name)。可能是因为需要为同一个项目创建不同的版本,也有可能是在投放市场之前需要更改包名,以防止与现有应用程序冲突。本篇文章将介绍在Android Studio中如何更改应用程序包名。 何时需要更改应用程序包名 在Android中,应用程序包名用…

    其他 2023年3月28日
    00
  • 只要十步就能学会用CSS建设网站 CSS建站的十个步骤(图文教程)

    只要十步就能学会用CSS建设网站 步骤一:创建HTML文件 首先,创建一个HTML文件,可以使用任何文本编辑器。将文件保存为.html扩展名。 示例: <!DOCTYPE html> <html> <head> <title>我的网站</title> <link rel=\"styl…

    other 2023年9月6日
    00
  • 魔兽世界达萨罗之战BOSS打法攻略 达萨罗之战全BOSS打法要点详解

    魔兽世界达萨罗之战BOSS打法攻略 BOSS介绍 达萨罗之战共有九个BOSS,分别是: 丰灵 国王的试炼(全明星赛) 低语者沃尔兹斯 大厅哨兵 天空队长热炮 纳特拉·血怒 玉火大师 拆解者米斯拉克斯 格洛恩,还有他的三个尖牙战士 每个BOSS都有独特的机制和技能,需要团队成员相互配合才能成功击败。 达萨罗之战全BOSS打法要点详解 丰灵 丰灵是达萨罗之战的第…

    other 2023年6月27日
    00
  • Android开发之App widget用法实例分析

    标题:Android开发之App widget用法实例分析 一、什么是App Widget App Widget 是 Android 系统提供的一种轻量级的应用组件,用于在桌面上显示有关应用程序的信息。它能够在桌面上完成部分应用的功能,而无需打开应用本身,非常方便用户。比如,我们可以使用一个 App Widget 显示当前天气情况或者显示某个网站的最新新闻等…

    other 2023年6月27日
    00
  • mysql 存储过程中变量的定义与赋值操作

    当在MySQL存储过程中定义和使用变量时,可以按照以下步骤进行操作: 定义变量:在存储过程的开头或需要使用变量的地方,使用DECLARE语句来定义变量。语法如下: sql DECLARE variable_name datatype [DEFAULT initial_value]; 其中,variable_name是变量的名称,datatype是变量的数据类…

    other 2023年8月9日
    00
  • 枪神纪开发者评测分析 枪神纪开发者怎么样

    枪神纪开发者评测分析 枪神纪是一款由魏明达独立开发,Shelter Games制作的射击游戏,玩家扮演一名战士,在未来世界中对抗机器人。以下是关于枪神纪开发者的评测分析和攻略。 枪神纪开发者怎么样? 开发者背景 魏明达是一位来自中国的独立游戏开发者,他在2003年开始制作游戏,并且参与了多个游戏项目的开发。他的作品涉及多个领域,包括2D和3D游戏、移动平台游…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部