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日

相关文章

  • 基于Centos7 部署Varnish缓存代理服务器

    下面提供一份详细的基于Centos7部署Varnish缓存代理服务器的攻略,过程中包含两个示例说明: 1. 安装Varnish Varnish是一个开源的缓存代理服务器软件,它可以加速Web应用程序的响应速度,降低服务器的负载。在Centos7上安装Varnish很简单,你只需要按照以下命令进行操作即可: sudo yum install epel-rele…

    Java 2023年6月15日
    00
  • Spring Boot实现热部署的五种方式

    Spring Boot是一个快速开发框架,可以帮助开发人员快速构建Web应用程序。在开发过程中,经常需要修改代码并重新编译,这会浪费很多时间。为了提高开发效率,Spring Boot提供了热部署功能,可以在不重启应用程序的情况下实时更新代码。本文将介绍Spring Boot实现热部署的五种方式,并提供两个示例。 方式一:使用Spring Boot DevTo…

    Java 2023年5月15日
    00
  • Java查询时间段(startTime–endTime)间的数据方式

    针对Java查询时间段(startTime–endTime)间的数据方式,我提供以下完整攻略。 1. 时间格式 首先需要明确Java程序所使用的时间格式,常见的有”yyyy-MM-dd HH:mm:ss”、”yyyyMMddHHmmss”等。假设我们的时间格式为”yyyy-MM-dd HH:mm:ss”。 2. SQL查询语句 接下来就是SQL查询语句,假…

    Java 2023年5月20日
    00
  • jquery zTree异步加载简单实例分享

    首先,让我们来了解一下什么是 jQuery zTree 以及异步加载。 jQuery zTree 是什么? jQuery zTree 是一款基于 jQuery 的树形视图插件,它具有结构清晰、功能强大和使用简便的特点。它可以帮助我们轻松实现一个树形结构的网页,比如分类列表、目录树、导航菜单等等。 异步加载是什么? 当我们需要渲染的树形结构数据较大时,如果一次…

    Java 2023年6月15日
    00
  • java application maven项目打自定义zip包实例(推荐)

    下面是“Java Application Maven项目打自定义zip包实例”的详细攻略。 简述 在程序的开发过程中,通常需要将代码及其附属资源打包为可执行的程序或库,并进行发布和分发。Maven是一个非常流行的Java包管理工具,可以通过Maven来打包生成自定义的zip包。 步骤 创建Maven项目 首先需要创建一个简单的Maven项目。使用Maven …

    Java 2023年5月20日
    00
  • Java 分位点(分位值)计算方式

    当需要将一组数据进行分布分析时,可以通过计算分位点(quantile),常用的分位点有中位数、上四分位数、下四分位数等。在Java中,可以使用Apache Commons Math库来计算分位点,本文将介绍Java分位点计算方式的完整攻略。 引入依赖 要使用Apache Commons Math库,需要在pom.xml文件中添加以下依赖: <depen…

    Java 2023年5月26日
    00
  • SpringMVC @RequestMapping注解属性详细介绍

    以下是关于“SpringMVC @RequestMapping注解属性详细介绍”的完整攻略,其中包含两个示例。 SpringMVC @RequestMapping注解属性详细介绍 在SpringMVC中,@RequestMapping注解是一个非常重要的注解,它用于将请求映射到对应的控制器方法上。@RequestMapping注解有很多属性,下面我们来详细介…

    Java 2023年5月16日
    00
  • JAVA的Random类的用法详解

    JAVA的Random类的用法详解 java.util.Random类是一个用于生成伪随机数的类,它在Java中的使用非常广泛。在今天的攻略中,我们将详细讲解Random类的各种用法,以帮助您更好地掌握它的使用方法。 生成随机数 首先,我们来看下如何使用Random类来生成随机数。 随机数的类型可以是整数或浮点数。 生成整数随机数 生成整数随机数的方法是使用…

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