java 树形结构只返回每个节点最后一个

查询数据库所有的标签类(labelPO)得出数据,再组装成tree,然后使用lambda处理数据,使得只返回树结构每个节点的最后一个

实体类 标签类labelPO

@Data
@AllArgsConstructor
@NoArgsConstructor
public class LabelPO {

    private Long id;
    private String name;
    private Long partentId;
    private Long level;

    private List<LabelPO> childern;

    public LabelPO(Long id, String name, Long partentId, Long level) {
        this.id = id;
        this.name = name;
        this.partentId = partentId;
        this.level = level;
    }
}

数据处理

public class Blog {
    public static void main(String[] args) {
        // 构造数据
        final List<LabelPO> list = initData();
        // tree的临时变量
        List<LabelPO> childListsTemp = list;
        // 最终返回类
        List<LabelPO> childList=new ArrayList<>();

        // 把全量数据转为tree
        List<LabelPO> collect = list.stream()
                //找到所有最顶级的节点
                .filter(e -> e.getPartentId().equals(0L))
                查找顶级节点的所有子节点
                .map(e -> covert(e, childListsTemp))
                .collect(Collectors.toList());
        //System.out.println(JSON.toJSONString(collect));

        // 只返回tree每一个顶级的最后一个节点
        for (LabelPO listDTO : collect) {
            List<LabelPO> lists = get3Child(listDTO);
            childList.addAll(lists);
        }
        System.out.println(JSON.toJSONString(childList));
    }

    private static List<LabelPO> get3Child(LabelPO dto) {
        List<LabelPO> list = new ArrayList<>();
        //1.第一次拿到的是根节点
        List<LabelPO> children = dto.getChildern();
        //2.如果有子遍历根节点
        if (children != null && children.size() > 0) {
            for (LabelPO child : children) {
                List<LabelPO> child1 = get3Child(child);
                for (LabelPO centerTitleDto : child1) {
                    list.add(centerTitleDto);
                }
            }
        } else {
            list.add(dto);
        }
        return list;
    }


    /**
     * 返回当前节点的以及所有子节点
     *
     * @param nodeTree     当前节点
     * @param nodeTreeList 所有节点
     * @return
     */
    public static LabelPO covert(LabelPO nodeTree, List<LabelPO> nodeTreeList) {
        List<LabelPO> children = nodeTreeList.stream()
                //过滤出当前节点的下一级子节点
                .filter(subNodeTree -> subNodeTree.getPartentId().equals(nodeTree.getId()))
                //递归查找
                .map(subNodeTree -> covert(subNodeTree, nodeTreeList)).collect(Collectors.toList());
        nodeTree.setChildern(children);
        return nodeTree;
    }

    private static List<LabelPO> initData() {
        List<LabelPO> list = new ArrayList<>();
        list.add(new LabelPO(1L, "标签一", 0L, 1L));
        list.add(new LabelPO(2L, "标签二", 0L, 1L));
        list.add(new LabelPO(3L, "标签三", 1L, 2L));
        list.add(new LabelPO(4L, "标签四", 3L, 3L));
        list.add(new LabelPO(5L, "标签五", 2L, 2L));
        return list;
    }
}

组装的tree数据

[
    {
        "childern":[
            {
                "childern":[
                    {
                        "childern":[

                        ],
                        "id":4,
                        "level":3,
                        "name":"标签四",
                        "partentId":3
                    }
                ],
                "id":3,
                "level":2,
                "name":"标签三",
                "partentId":1
            }
        ],
        "id":1,
        "level":1,
        "name":"标签一",
        "partentId":0
    },
    {
        "childern":[
            {
                "childern":[

                ],
                "id":5,
                "level":2,
                "name":"标签五",
                "partentId":2
            }
        ],
        "id":2,
        "level":1,
        "name":"标签二",
        "partentId":0
    }
]

最终返回数据

[
    {
        "childern":[

        ],
        "id":4,
        "level":3,
        "name":"标签四",
        "partentId":3
    },
    {
        "childern":[

        ],
        "id":5,
        "level":2,
        "name":"标签五",
        "partentId":2
    }
]
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法与数据结构涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
算法与数据结构涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
算法与数据结构它们分别涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值