树形数据工具类

原文链接

在日常开发中,我们经常会遇到需要处理数据库中的树形数据的需求,我们需要一个工具类来减少代码的重复编写。本文将介绍一个树形数据工具类TreeUtils,他可以将节点列表转换为树形结构,其中每个节点需要有id属性、parentId属性和子节点列表。下面是源代码:

TreeVO.java

public interface TreeVO {
    /**
     * 获取节点ID
     */
    Integer getId();

    /**
     * 获取名称
     */
    default String getName() {
        return "";
    }

    /**
     * 获取父节点ID
     */
    Integer getParentId();

    /**
     * 设置子节点列表
     */
    void setChildren(List<TreeVO> children);

    /**
     * 设置父节点名称
     */
    default void setParentName(String parentName) {
    }
}

TreeUtils.java

public class TreeUtils {

    public static <T extends TreeVO> List<T> convertToTree(List<T> allNodes) {
        return convertToTree(0, allNodes);
    }

    public static <T extends TreeVO> List<T> convertToTree(Integer rootId, List<T> allNodes) {

        Map<Integer, List<T>> parentIdToNodeList = allNodes.stream().collect(groupingBy(T::getParentId, toList()));
        Map<Integer, String> id2Name = allNodes.stream().collect(toMap(T::getId, T::getName));
        for (T node : allNodes) {
            node.setChildren(new ArrayList<>(parentIdToNodeList.getOrDefault(node.getId(), new ArrayList<>(0))));
            node.setParentName(id2Name.getOrDefault(node.getParentId(), ""));
        }

        return parentIdToNodeList.getOrDefault(rootId, allNodes);
    }

}

首先根节点的ID将所有节点分组,并利用节点的ID建立父节点与子节点之间的关系。最后,返回根节点的子节点列表。

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值