利用Map把一维数据转换成树结构

简介: 利用Map把一维数据转换成树结构

利用有序Map把一维数据转换为树结构的方法

转换为树结构的工具类:

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class AssmTreeUtil {
  /**
  * 组装树结构数据的方法
  */
  public static List<TreeNode> assmTree(List<TreeNode> singleTreeNodes) {
    // 判断排序数据是否为空
    if(singleTreeNodes == null || singleTreeNodes.isEmpty()) {
      return null;
    }
    // 用有序Map把传参组装起来
    Map<String,TreeNode> nodeId2treeNodes = new LinkedHashMap<String,TreeNode>();
    for(TreeNode node : singleTreeNodes){
      TreeNode treeNode = new TreeNode();
      treeNode.setNodeId(node.getNodeId());
      treeNode.setNodeName(node.getNodeName());
      treeNode.setPid(node.getPid());
      nodeId2treeNodes.put(node.getNodeId(), treeNode);
    }
    // 用来保存组装好的数据, 作为返回值
    List<TreeNode> topNodeTrees = new ArrayList<TreeNode>();
    // 遍历所有节点
    for(String nodeId : nodeId2treeNodes.keySet()){
      TreeNode treeNode = nodeId2treeNodes.get(nodeId);
      String pid = treeNode.getPid();
      // 当前节点的父id为空 或 整个列表中没有以此父id作为自己的id的情况
      // 即当前节点是根节点
      if(pid==null || pid.length()==0 || !nodeId2treeNodes.containsKey(pid)){
        // treeNode.setPid(""); // 此处可以根据需要调整父id的值
        topNodeTrees.add(treeNode);
      }else{ // 不是父节点, 作为子节点添加进去
        TreeNode parentTreeNode = nodeId2treeNodes.get(pid);
        if(parentTreeNode.getChildren()==null){
          parentTreeNode.setChildren(new ArrayList<TreeNode>());
        }
        parentTreeNode.getChildren().add(treeNode);
      }
    }
    return topNodeTrees;
  }
}

TreeNode bean类:

import java.util.List;
public class TreeNode {
  /**
   * 父节点ID
   */
  private String pid;
  /**
   * 节点ID
   */
  private String nodeId;
  /**
   * 节点名称
   */
  private String nodeName;
  /**
   * 子节点
   */
  private List<TreeNode> children;
  public String getPid() {
    return pid;
  }
  public void setPid(String pid) {
    this.pid = pid;
  }
  public String getNodeId() {
    return nodeId;
  }
  public void setNodeId(String nodeId) {
    this.nodeId = nodeId;
  }
  public String getNodeName() {
    return nodeName;
  }
  public void setNodeName(String nodeName) {
    this.nodeName = nodeName;
  }
  public List<TreeNode> getChildren() {
    return children;
  }
  public void setChildren(List<TreeNode> children) {
    this.children = children;
  }
}

测试:

import java.util.ArrayList;
import java.util.List;
/**
 * 测试组装树结构方法
 * @Author: Rebecca Zhong
 * @Description:
 * @Date: Created in 2019/3/7 10:31
 * @Modified By:
 */
public class Test {
    public static void main(String[] args) {
        List<TreeNode> singleNodes = new ArrayList<TreeNode>();
        singleNodes.add(new TreeNode("a","1","节点1"));
        singleNodes.add(new TreeNode("b","2","节点2"));
        singleNodes.add(new TreeNode("c","3","节点3"));
        singleNodes.add(new TreeNode("1","4","节点1-1"));
        singleNodes.add(new TreeNode("2","5","节点2-1"));
        singleNodes.add(new TreeNode("1","6","节点1-3"));
        singleNodes.add(new TreeNode("1","7","节点1-2"));
        singleNodes.add(new TreeNode("2","8","节点2-2"));
        List<TreeNode> treeNodes = AssmTreeUtil.assmTree(singleNodes);
        outputResult(treeNodes);
    }
    private static void outputResult(List<TreeNode> treeNodes) {
        for (TreeNode treeNode : treeNodes) {
            System.out.println("nodeId: " + treeNode.getNodeId() + "; pid: " + treeNode.getPid() + "; name: "+treeNode.getNodeName());
            List<TreeNode> childrenNode = treeNode.getChildren();
            if (childrenNode != null) {
                outputResult(childrenNode);
            }
        }
    }
}

期望结果:

  1. 节点1
    1.1 节点1-1
    1.2 节点1-3
    1.3 节点1-2
  2. 节点2
    2.1 节点2-1
    2.2 节点2-2
  3. 节点3

输出结果:

nodeId: 1; pid: a; name: 节点1
nodeId: 4; pid: 1; name: 节点1-1
nodeId: 6; pid: 1; name: 节点1-3
nodeId: 7; pid: 1; name: 节点1-2
nodeId: 2; pid: b; name: 节点2
nodeId: 5; pid: 2; name: 节点2-1
nodeId: 8; pid: 2; name: 节点2-2
nodeId: 3; pid: c; name: 节点3

小结:

利用ArrayList也可以实现相关功能,但代码整体较长,不利于维护。

利用LinkedHashMap代码更简洁一些。


目录
相关文章
|
Java 数据库连接 mybatis
mybatis返回map类型数据空值字段不显示(三种解决方法)
mybatis返回map类型数据空值字段不显示(三种解决方法)
|
26天前
|
存储 Java API
深入剖析Java Map:不只是存储数据,更是设计艺术的体现!
【10月更文挑战第17天】在Java编程中,Map是一种重要的数据结构,用于存储键值对,并展现了设计艺术的精髓。本文深入剖析了Map的设计原理和使用技巧,包括基本概念、设计艺术(如哈希表与红黑树的空间时间权衡)、以及使用技巧(如选择合适的实现类、避免空指针异常等),帮助读者更好地理解和应用Map。
80 3
SpringMVC入门到实战------5、域对象共享数据 Request、Session、Application、Model、ModelAndView、Map、ModelMap的详细使用及代码实例
这篇文章详细解释了在IntelliJ IDEA中如何使用Mute Breakpoints功能来快速跳过程序中的后续断点,并展示了如何一键清空所有设置的断点。
SpringMVC入门到实战------5、域对象共享数据 Request、Session、Application、Model、ModelAndView、Map、ModelMap的详细使用及代码实例
|
6月前
|
数据处理
利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式
利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式
60 0
域对象共享数据model、modelAndView、map、mapModel、request。从源码角度分析
这篇文章详细解释了在IntelliJ IDEA中如何使用Mute Breakpoints功能来快速跳过程序中的后续断点,并展示了如何一键清空所有设置的断点。
域对象共享数据model、modelAndView、map、mapModel、request。从源码角度分析
|
3月前
|
存储 算法 Java
Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
|
3月前
|
JavaScript 前端开发
Vue中传递自定义参数到后端、后端获取数据(使用Map接收参数)
这篇文章讲述了如何在Vue中通过Axios二次封装传递自定义参数到后端,并展示了后端如何使用Map接收这些参数,以及如何避免参数转换错误和统一接口设计的方法。
|
3月前
|
JSON 数据可视化 定位技术
Map——使用BIGEMAP+geojson获取乡镇行政边界数据
Map——使用BIGEMAP+geojson获取乡镇行政边界数据
167 0
|
5月前
|
缓存 安全 算法
Go 中使用 map 实现高效的数据缓存
Go 中使用 map 实现高效的数据缓存
|
5月前
|
存储 缓存 安全
Go 中使用 map 实现高效的数据查找和更新
Go 中使用 map 实现高效的数据查找和更新