java jdk1.8+递归实现树结构

如何拼装树结构?

可以使用jdk1.8+递归可以实现

 

 

 

代码如下:

1、实体类

package com.daka.dto;

import lombok.*;

/**
 * 数据
 */
@Data
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TreeStructureDTO {

    /**
     * 节点id
     */
    private Long id;

    /**
     * 节点名称
     */
    private String name;

    /**
     * 父节点
     */
    private Long parentId;

    /**
     * 层级
     *
     */
    private Integer level;

    /**
     * 根目录
     */
    private Long rootId;

}

2、树对象:

package com.daka.vo;

import lombok.*;

import java.util.List;

@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Tree {

    private Long id;

    private String name;

    private Long parentId;

    private List<Tree> children;
}

3、实现

package com.daka.daka;

import com.alibaba.fastjson.JSON;
import com.daka.dto.TreeStructureDTO;
import com.daka.util.StructureUtils;
import com.daka.vo.Tree;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 处理树
 */
public class StructureOperation {

    public static void main(String[] args){
        // 获取参数
        List<TreeStructureDTO> structureDTOS = packData();
        System.out.println("树结构param:" + JSON.toJSONString(structureDTOS));
        // 开始组装树
        // 现先获取根节点
        TreeStructureDTO rootTreeStructure = structureDTOS.stream()
                .filter(structureDTO -> structureDTO.getParentId() == null)
                .collect(Collectors.toList()).get(0);
        Tree rootTree = Tree.builder()
                .id(rootTreeStructure.getId())
                .name(rootTreeStructure.getName())
                .parentId(null)
                .build();

        Tree tree = StructureUtils.packageTree(structureDTOS, rootTree);
        System.out.println("树结构result:" + JSON.toJSONString(tree));
    }

    /**
     * 组装数据(模拟从数据库中获取)
     */
    public static List<TreeStructureDTO> packData(){
        List<TreeStructureDTO> result = new ArrayList<TreeStructureDTO>();
        result.add(TreeStructureDTO.builder().id(1L).parentId(null).name("根节点").rootId(null).level(0).build());
        result.add(TreeStructureDTO.builder().id(2L).parentId(1L).name("1级节点A").rootId(1L).level(1).build());
        result.add(TreeStructureDTO.builder().id(3L).parentId(1L).name("1级节点B").rootId(1L).level(1).build());

        result.add(TreeStructureDTO.builder().id(4L).parentId(2L).name("2级节点A").rootId(1L).level(2).build());
        result.add(TreeStructureDTO.builder().id(5L).parentId(2L).name("2级节点B").rootId(1L).level(2).build());
        result.add(TreeStructureDTO.builder().id(6L).parentId(3L).name("2级节点C").rootId(1L).level(2).build());

        result.add(TreeStructureDTO.builder().id(7L).parentId(5L).name("3级节点A").rootId(1L).level(3).build());
        result.add(TreeStructureDTO.builder().id(8L).parentId(6L).name("3级节点B").rootId(1L).level(3).build());
        result.add(TreeStructureDTO.builder().id(9L).parentId(6L).name("3级节点C").rootId(1L).level(3).build());

        return result;
    }
}

4、递归实现:

package com.daka.util;

import com.daka.dto.TreeStructureDTO;
import com.daka.vo.Tree;

import java.util.ArrayList;
import java.util.List;

public class StructureUtils {

    public static Tree packageTree(List<TreeStructureDTO> structureDTOS, Tree rootTree){
        if (structureDTOS != null && structureDTOS.size() > 0) {
            structureDTOS.forEach(structureDTO -> judgeObj(structureDTO, rootTree));
            if (rootTree.getChildren() != null && rootTree.getChildren().size() > 0) {
                rootTree.getChildren().forEach(r -> packageTree(structureDTOS, r));
            }
        }
        return rootTree;
    }

    public static void judgeObj(TreeStructureDTO structureDTO, Tree rootTree){
        List<Tree> children = rootTree.getChildren();
        if (children == null) {
            children = new ArrayList<>();
        }
        if (structureDTO.getParentId() != null && rootTree.getId().equals(structureDTO.getParentId())) {
            children.add(Tree.builder().id(structureDTO.getId()).name(structureDTO.getName()).parentId(structureDTO.getParentId()).build());
            rootTree.setChildren(children);
        }
    }
}

 

 

入参:

[{"id":1,"level":0,"name":"根节点"},
{"id":2,"level":1,"name":"1级节点A","parentId":1,"rootId":1},
{"id":3,"level":1,"name":"1级节点B","parentId":1,"rootId":1},
{"id":4,"level":2,"name":"2级节点A","parentId":2,"rootId":1},
{"id":5,"level":2,"name":"2级节点B","parentId":2,"rootId":1},
{"id":6,"level":2,"name":"2级节点C","parentId":3,"rootId":1},
{"id":7,"level":3,"name":"3级节点A","parentId":5,"rootId":1},
{"id":8,"level":3,"name":"3级节点B","parentId":6,"rootId":1},
{"id":9,"level":3,"name":"3级节点C","parentId":6,"rootId":1}]

 

结果:

{
	"children": [{
		"children": [{
			"id": 4,
			"name": "2级节点A",
			"parentId": 2
		}, {
			"children": [{
				"id": 7,
				"name": "3级节点A",
				"parentId": 5
			}],
			"id": 5,
			"name": "2级节点B",
			"parentId": 2
		}],
		"id": 2,
		"name": "1级节点A",
		"parentId": 1
	}, {
		"children": [{
			"children": [{
				"id": 8,
				"name": "3级节点B",
				"parentId": 6
			}, {
				"id": 9,
				"name": "3级节点C",
				"parentId": 6
			}],
			"id": 6,
			"name": "2级节点C",
			"parentId": 3
		}],
		"id": 3,
		"name": "1级节点B",
		"parentId": 1
	}],
	"id": 1,
	"name": "根节点"
}

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值