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

yizhihongxing

以下是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日

相关文章

  • 基于Spring Boot保护Web应用程序

    下面我将详细讲解基于Spring Boot保护Web应用程序的完整攻略。 1. 目标 保护Web应用程序是非常重要的,因为Web应用程序经常面临各种来自外部的威胁,如SQL注入、跨站脚本、会话劫持等。本攻略的目标是使用Spring Boot防御这些攻击并保护Web应用程序的安全。具体来说,我们将使用以下方法来实现这个目标: 基于Spring MVC和Thym…

    Java 2023年6月3日
    00
  • java中计算字符串长度的方法及u4E00与u9FBB的认识

    Java中计算字符串长度的方法 在Java中计算字符串长度是一项常见的任务,在实际开发中也有很多场景需要计算字符串的长度。本攻略将介绍Java中计算字符串长度的方法以及相关的知识点,包括中文字符的Unicode编码等。 1. String类的length()方法 Java中的String类提供了length()方法来计算字符串的长度,它返回的是字符串中的字符…

    Java 2023年5月20日
    00
  • java多线程-读写锁原理

    下面就为您提供“Java多线程-读写锁原理”的完整攻略。希望对您有所帮助。 1. 读写锁简介 Java中的读写锁是一种特殊的锁,它对于多个线程的访问有着不同的限制。 一般情况下,读锁是共享锁,可以被多个线程共享;写锁是独占锁,只能被单个线程所持有。 在Java中,读写锁的实现是通过ReentrantReadWriteLock类来进行的。在该类中,提供了读锁和…

    Java 2023年5月19日
    00
  • java 重试框架 sisyphus 入门介绍

    下面是关于 Java 重试框架 Sisyphus 的入门介绍及完整攻略。 Sisyphus 是什么? Sisyphus 是一个 Java 重试框架。它的主要作用是在某些特定场景下,自动地对失败的操作进行重试。 Sisyphus 可以非常方便地配置,适用于多种使用场景,包括但不限于网络请求、数据库操作等。Sisyphus 还有非常完善的监控和日志记录机制,可以…

    Java 2023年5月19日
    00
  • Spring Security中防护CSRF功能详解

    Spring Security中防护CSRF功能详解 Cross-Site Request Forgery(CSRF)攻击是一种网络安全攻击,攻击者通过伪造用户身份信息来完成一些非法操作。Spring Security使用一些策略来保护应用程序免受CSRF攻击。本文将介绍Spring Security防护CSRF功能的全过程,包括配置和示例。 配置 配置Sp…

    Java 2023年6月3日
    00
  • Java的无参构造函数用法实例分析

    Java的无参构造函数用法实例分析 简介 在Java中,类的构造函数用来初始化类的对象。如果我们不手动定义某些构造函数,Java编译器就会提供一个默认的构造函数。默认的构造函数是没有参数的,也称为无参构造函数。无参构造函数在我们需要创建一个类的新对象时非常有用。 无参构造函数的作用 Java中的无参构造函数主要有以下两个作用:1. 初始化对象中的变量,一般是…

    Java 2023年5月26日
    00
  • Java实现redis分布式锁的三种方式

    Java实现redis分布式锁的三种方式 在分布式系统中,实现分布式锁是很重要的一个需求。Redis作为一个内存数据库,具有高性能、高可用、操作简便等优点,因此被广泛应用于实现分布式锁。 本文将介绍Java实现redis分布式锁的三种方式:使用Redis的setnx命令、使用Lua脚本实现乐观锁、使用Redisson(一个流行的Redis客户端)实现分布式锁…

    Java 2023年5月20日
    00
  • Java 通过JDBC连接Mysql数据库

    下面为你详细讲解“Java 通过JDBC连接Mysql数据库”的完整攻略,主要包括以下几个步骤: 准备工作 在开始之前,需要先确保以下几个方面已经满足: 已经安装了Java开发环境(JDK) 已经安装了Mysql数据库,并且知道数据库的用户名和密码 下载了Mysql的JDBC驱动程序,可从官网下载或通过Maven管理工具引入 导入JDBC驱动程序 在Java…

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