将数据转换为树型结构

基础数据类型:

package com.demo.tree.test;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
class DemoData {
    /**
     * ID
     */
    private Integer id;
    /**
     * 父级ID
     */
    private Integer pid;
    /**
     * 编码
     */
    private String code;
    /**
     * 名字
     */
    private String name;
    /**
     * 排序编码
     */
    private Integer sort;
    /**
     * 子节点数据
     */
    private List<DemoData> children;
 
    public DemoData(Integer id, Integer pid, String code, String name, Integer sort) {
        this.id = id;
        this.pid = pid;
        this.code = code;
        this.name = name;
        this.sort = sort;
    }
}

转换工具:

package com.demo.tree.test;


import com.alibaba.fastjson2.JSON;
import org.springframework.util.CollectionUtils;
 
import java.util.*;
import java.util.stream.Collectors;
 
/**
 * 平行集合转Tree集合测试示例
 */
public class ListToTreeDemo {
 
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        List<DemoData> demoData = transToTree(data());
        long end = System.currentTimeMillis();
        System.out.println("耗时:"+ (end - start) + "ms,转换后的数据:\n" + JSON.toJSONString(demoData));
    }
 
    /**
     * 将数据转换为树型结构
     *
     * @param sources sources
     * @return {@link List<DemoData>}
     */
    public static List<DemoData> transToTree(List<DemoData> sources) {
        if (CollectionUtils.isEmpty(sources)) {
            return Collections.emptyList();
        }
        Map<Integer, DemoData> sourceMap = sources.stream().collect(Collectors.toMap(DemoData::getId, e -> e));
        Map<Integer, List<DemoData>> pIdToChildrenListMap = sources.stream().collect(Collectors.groupingBy(DemoData::getPid));
        List<Integer> willBeRemovedIdList = new LinkedList<>();
        for (Map.Entry<Integer, List<DemoData>> entry : pIdToChildrenListMap.entrySet()) {
            DemoData demoData = sourceMap.get(entry.getKey());
            if (demoData == null) {
                continue;
            }
            demoData.setChildren(entry.getValue().stream().sorted(Comparator.comparing(DemoData::getSort)).collect(Collectors.toList()));
            willBeRemovedIdList.add(entry.getKey());
        }
        willBeRemovedIdList.forEach(pIdToChildrenListMap::remove);
        // 获取顶级
        return pIdToChildrenListMap.values().stream().flatMap(Collection::stream).sorted(Comparator.comparing(DemoData::getSort)).collect(Collectors.toList());
    }
 
    /**
     * 生成测试数据
     *
     * @return {@link List<DemoData>}
     */
    public static List<DemoData> data() {
        List<DemoData> results = new LinkedList<>();
        results.add(new DemoData(1, 0, "CE_SHI_A", "测试A", 1));
        results.add(new DemoData(2, 1, "CE_SHI_A_001", "测试A001", 2));
        results.add(new DemoData(3, 1, "CE_SHI_A_002", "测试A002", 3));
        results.add(new DemoData(4, 1, "CE_SHI_A_003", "测试A003", 4));
 
        results.add(new DemoData(5, 0, "CE_SHI_B", "测试B", 5));
        results.add(new DemoData(6, 5, "CE_SHI_B_001", "测试B001", 6));
        results.add(new DemoData(7, 5, "CE_SHI_B_002", "测试B002", 7));
        results.add(new DemoData(8, 5, "CE_SHI_B_003", "测试B003", 8));
 
        results.add(new DemoData(9, 2, "CE_SHI_A01", "测试A01", 9));
        results.add(new DemoData(10, 2, "CE_SHI_A02_001", "测试A02001", 10));
        results.add(new DemoData(11, 2, "CE_SHI_A03_002", "测试A03002", 11));
        results.add(new DemoData(12, 2, "CE_SHI_A04_003", "测试A04003", 12));
 
        results.add(new DemoData(13, 6, "CE_SHI_B01", "测试B01", 13));
        results.add(new DemoData(14, 6, "CE_SHI_B02_001", "测试B02001", 14));
        results.add(new DemoData(15, 6, "CE_SHI_B03_002", "测试03B002", 15));
        results.add(new DemoData(16, 6, "CE_SHI_B04_003", "测试B04003", 16));
        return results;
    }
 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值