Java将平级数据转为树状数据?

发布于 2022-09-13 00:17:49 字数 602 浏览 17 评论 0

源数据(来源于mysql数据库):

 {id=1, name=A,   parentId=null}
 {id=5, name=AA,  parentId=1}
 {id=7, name=AB,  parentId=1}
 {id=9, name=C,   parentId=null}
 {id=6, name=CA,  parentId=9}
 {id=2, name=CAA, parentId=6}

期望数据(层级深度无限制):

 {id=1, name=A,   parentId=null, childs=[
    {id=5, name=AA,  parentId=1}
    {id=7, name=AB,  parentId=1}
 ]}
 {id=9, name=C,   parentId=null, childs=[
    {id=6, name=CA,  parentId=9, childs=[
       {id=2, name=CAA, parentId=6}
    ]}
 ]}

有什么好的算法和工具吗,大家?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

盗琴音 2022-09-20 00:17:49

希望你这个数据量不大,需要经过两次遍历。

  1. 建立一个索引,就是Map: id -> data
  2. 再次遍历,根据parentId,获取【1】中的父级对象,将自己添加到父级的childs中。

我自己写过一个工具,可以参考里面的逻辑:

public static <T> List<TreeNodeMap> build(List<T> sources, Object rootParentId, TreeNodeConfig treeNodeConfig, Transfer<T, TreeNodeMap> transfer) {
        List<TreeNodeMap> treeNodes = new ArrayList<>(sources.size());
        Map<Object, TreeNodeMap> nodeMap = new HashMap<>();
        for (T src : sources) {
            TreeNodeMap treeNode;
            if(src instanceof TreeNodeMap) {
                treeNode = (TreeNodeMap) src;
            }else{
                treeNode = new TreeNodeMap(treeNodeConfig);
            }
            transfer.transfer(src, treeNode);
            treeNodes.add(treeNode);
            nodeMap.put(treeNode.getId(), treeNode);
        }

        List<TreeNodeMap> finalTreeNodes = new ArrayList<>();
        for (TreeNodeMap treeNode : treeNodes) {
            if ((rootParentId == null && treeNode.getParentId() == null) || (rootParentId != null && rootParentId.equals(treeNode.getParentId()))) {
                finalTreeNodes.add(treeNode);
            } else {
                TreeNodeMap parentNode = nodeMap.get(treeNode.getParentId());
                if (parentNode != null) {
                    List<TreeNodeMap> children = parentNode.getChildren();
                    if (children == null) {
                        children = new ArrayList<>();
                        parentNode.setChildren(children);
                    }
                    children.add(treeNode);
                }
            }
        }
        return finalTreeNodes;
    }
智商已欠费 2022-09-20 00:17:49
private List<Data> generateDeptTreeData(List<Data> datas) {
    return datas.stream()
            //筛选出根节点
            .filter(data -> Objects.isNull(data.getParentId())
            .peek(data -> data.setChildren(generateChildrenData(data, datas)))
            .collect(Collectors.toList());
}

private List<Data> generateChildrenData(Data data, List<Data> datas) {
    return datas.stream()
            // 筛选出下一节点元素
            .filter(data -> Objects.equals(data.getId(), data.getParentId()))
            .peek(data -> {
                data.setChildren(this.generateChildrenData(data, datas));
            }).collect(Collectors.toList());
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文