Java实现树形List与扁平List互转的示例代码

以下是Java实现树形List与扁平List互转的完整攻略。

1. 概述

树形结构和扁平结构是常用的数据结构之一,在业务开发过程中常常需要互相转换。本攻略给出Java实现树形List与扁平List互转的示例代码。

2. 树形List转为扁平List

树形结构的定义:

public class TreeNode {
    private String id;
    private String parentId;
    private String name;
    private List<TreeNode> children = new ArrayList<>();
    // get/set方法省略
}

树形List的数据示例:

List<TreeNode> treeNodes = new ArrayList<>();
treeNodes.add(new TreeNode("1", null, "节点1"));
treeNodes.add(new TreeNode("2", "1", "节点2-1"));
treeNodes.add(new TreeNode("3", "1", "节点2-2"));
treeNodes.add(new TreeNode("4", "2", "节点3-1"));

其中,TreeNode类中的parentId代表该节点的父节点ID,根节点的父节点ID设为null

扁平结构的定义:

public class FlatNode {
    private String id;
    private String parentId;
    private String name;
    // get/set方法省略
}

树形List转为扁平List的示例代码:

public List<FlatNode> treeNodesToFlatNodes(List<TreeNode> treeNodes) {
    List<FlatNode> flatNodes = new ArrayList<>();
    for (TreeNode treeNode : treeNodes) {
        flatNodes.add(new FlatNode(treeNode.getId(), treeNode.getParentId(), treeNode.getName()));
        if (treeNode.getChildren().size() > 0) {
            flatNodes.addAll(treeNodesToFlatNodes(treeNode.getChildren()));
        }
    }
    return flatNodes;
}

通过遍历树形List的每个节点,生成扁平结构,如果有子节点,则递归生成子节点的扁平结构。

3. 扁平List转为树形List

扁平结构的定义:

public class FlatNode {
    private String id;
    private String parentId;
    private String name;
    // get/set方法省略
}

扁平List的数据示例:

List<FlatNode> flatNodes = new ArrayList<>();
flatNodes.add(new FlatNode("1", null, "节点1"));
flatNodes.add(new FlatNode("2", "1", "节点2-1"));
flatNodes.add(new FlatNode("3", "1", "节点2-2"));
flatNodes.add(new FlatNode("4", "2", "节点3-1"));

其中,FlatNode类中的parentId代表该节点的父节点ID,根节点的父节点ID设为null

树形结构的定义:

public class TreeNode {
    private String id;
    private String parentId;
    private String name;
    private List<TreeNode> children = new ArrayList<>();
    // get/set方法省略
}

扁平List转为树形List的示例代码:

public List<TreeNode> flatNodesToTreeNodes(List<FlatNode> flatNodes) {
    Map<String, TreeNode> map = new HashMap<>();
    List<TreeNode> rootNodes = new ArrayList<>();
    for (FlatNode flatNode : flatNodes) {
        map.put(flatNode.getId(), new TreeNode(flatNode.getId(), flatNode.getParentId(), flatNode.getName()));
    }
    for (FlatNode flatNode : flatNodes) {
        TreeNode treeNode = map.get(flatNode.getId());
        if (flatNode.getParentId() == null) {
            rootNodes.add(treeNode);
        } else {
            map.get(flatNode.getParentId()).getChildren().add(treeNode);
        }
    }
    return rootNodes;
}

遍历扁平List的每个节点,根据每个节点的父节点ID,建立节点之间的父子关系,同时将节点加入到父节点的子节点列表中,若该节点没有父节点,则为根节点。

4. 示例说明

假设有以下树形List结构的treeNodes数据:

List<TreeNode> treeNodes = new ArrayList<>();
treeNodes.add(new TreeNode("1", null, "节点1"));
treeNodes.add(new TreeNode("2", "1", "节点2-1"));
treeNodes.add(new TreeNode("3", "1", "节点2-2"));
treeNodes.add(new TreeNode("4", "2", "节点3-1"));

treeNodes进行转换,生成扁平List结构的flatNodes数据:

List<FlatNode> flatNodes = treeNodesToFlatNodes(treeNodes);

期望得到的flatNodes数据如下:

[
    {id: 1, parentId: null, name: "节点1"},
    {id: 2, parentId: "1", name: "节点2-1"},
    {id: 4, parentId: "2", name: "节点3-1"},
    {id: 3, parentId: "1", name: "节点2-2"}
]

再将flatNodes转换为树形List结构的treeNodes2数据:

List<TreeNode> treeNodes2 = flatNodesToTreeNodes(flatNodes);

期望得到的treeNodes2数据如下:

[
    {
        id: 1, 
        parentId: null, 
        name: "节点1", 
        children: [
            {
                id: 2, 
                parentId: "1", 
                name: "节点2-1", 
                children: [
                    {id: 4, parentId: "2", name: "节点3-1", children: []}
                ]
            }, 
            {
                id: 3, 
                parentId: "1", 
                name: "节点2-2", 
                children: []
            }
        ]
    }
]

以上就是Java实现树形List与扁平List互转的完整攻略,希望能对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现树形List与扁平List互转的示例代码 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • SpringBoot配置的加载流程详细分析

    Spring Boot配置的加载流程详细分析 Spring Boot是一个流行的Java框架,可以帮助开发人员快速构建和部署应用程序。在Spring Boot中,配置文件是非常重要的一部分,它们可以帮助我们配置应用程序的各种属性和行为。在本文中,我们将详细讲解Spring Boot配置的加载流程。 配置文件的加载顺序 Spring Boot支持多种类型的配置…

    Java 2023年5月15日
    00
  • SpringBoot HikariCP连接池详解

    SpringBoot HikariCP连接池详解 本文介绍如何使用SpringBoot和HikariCP来管理MySQL数据库连接池。 什么是HikariCP? HikariCP是一个高效的、快速的、轻量级的JDBC连接池,取名自日本的“光之屋”。与其他连接池相比,它有更快的启动时间、更小的内存占用以及更高的性能。 SpringBoot集成HikariCP …

    Java 2023年5月20日
    00
  • springsecurity中http.permitall与web.ignoring的区别说明

    在Spring Security中,我们可以使用http.permitAll()或者web.ignoring()来配置哪些接口需要放行。这两个方法虽然都可以达到相同的效果,但它们的实现方式有所不同。 http.permitAll() 是Spring Security提供的一个方法,它允许我们定义一组匹配URL的表达式,这些URL可以被所有用户访问。例如: p…

    Java 2023年5月20日
    00
  • 如何在Android studio导入jdk9及以上版本中依赖包,如’rt.jar’,’ dt.jar’等

    1、如何获取jdk9及以上版本中依赖包,如’rt.jar’,’ dt.jar’等 ​ 在jdk9及后续版本中,jdk开始使用模块化规则,实现更好的封装和定义良好的接口,近一步加强了java的自由度,开发者可以定制化SDK ​ 包括rt.jar在内的依赖均已移除,以模块化形式更高效的存诸在 JAVA_HOME/jmods目录下 ​ 如果需要可以用命令进行抽取,…

    Java 2023年4月25日
    00
  • Java抢红包的红包生成算法

    下面是“Java抢红包的红包生成算法”的完整攻略。 一、概述 “Java抢红包的红包生成算法”是一种随机分配金额的算法,可以用于生成指定金额的红包,并按照一定的规则把红包分配给多个人。该算法可以用于各种在线支付、社交娱乐等场景。 二、算法原理 “Java抢红包的红包生成算法”基于二倍均值法实现,具体原理如下: 假设红包总金额为totalMoney,红包个数为…

    Java 2023年5月19日
    00
  • Java如何实现将类文件打包为jar包

    下面我将详细讲解Java如何实现将类文件打包为jar包的攻略。 1. 创建Java项目 首先,我们需要创建一个Java项目,可以使用任何一种Java IDE,例如Eclipse、IntelliJ IDEA等等。创建好项目之后,我们需要编写Java类,并将这些类编译成.class文件。 2. 编写MANIFEST.MF文件 在将类文件打包为jar包之前,我们需…

    Java 2023年5月19日
    00
  • java使用jdbc连接数据库简单实例

    Java使用JDBC连接数据库简单实例 在Java中,我们通过JDBC(Java Database Connectivity) API来连接数据库。这里简单介绍一下如何使用JDBC连接数据库。 步骤 下载并安装数据库驱动程序。不同的数据库具有不同的驱动程序,请根据实际情况选择。 加载驱动程序,可以通过Class.forName()方法进行加载 java Cl…

    Java 2023年5月19日
    00
  • Java读取其下所有文件夹与文件路径的方法

    要读取Java程序中某个目录下的所有子目录和文件路径,可以使用以下步骤: 根据给定目录路径创建一个Java File实例: File root = new File("dir/path"); 使用Java IO API的File类中listFiles()方法获取指定目录下所有文件和子目录的File对象数组: File[] files = …

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部