java_扁平<--->树转换的思路和方法参考

news/2024/5/19 23:06:35 标签: java, 算法, 数据结构, 推荐算法

扁平转树形笔记

1.通过先找到根节点,然后在递归子节点的方法找子节点的子节点

java">public static List<Good> list2tree(List<Good> list){
        List<Good> resList = new ArrayList<>();
        for (Good good : list) {
            // 找到根节点
            if (good.getpId() == 0){
                Good root = getChild(good, list);
                resList.add(root);
            }
        }
        return resList;
    }
	// 找子节点方法
    public static Good getChild(Good parentNode,List<Good> list){
        for (Good good : list) {
            if (good.getpId() == parentNode.getId()){
                if (parentNode.getChildren() == null){
                    parentNode.setChildren(new ArrayList<>());
                }
                parentNode.getChildren().add(getChild(good, list));
            }
        }
        return parentNode;
    }

2.利用map集合的特性,将pid相同的元素归类到同一集合中用map存储pid为键元素集合为值

java">    public static List<Good> list2treeForMap(List<Good> list){
        // 通过相同的父节点,将数据分类
        Map<Integer,List<Good>> mapForPid = list.stream().collect(Collectors.groupingBy(good -> good.getpId()));
        // 遍历传入的集合
        List<Good> res = new ArrayList<Good>();
        for (Good good : list) {
            if (good.getpId() == 0){ // 根节点
                res.add(good);
            }
            // 获取通过id获取子节点数据
            List<Good> goodList = mapForPid.get(good.getId());
            if (goodList != null && goodList.size() > 0) { // 有子节点
                if (good.getChildren() == null){
                    good.setChildren(new ArrayList<>());
                }
                good.setChildren(goodList);
            }
        }
        return res;
    }

树形转扁平

java">public static List<Good> tree2list(List<Good> treeList){
        List<Good> resList = new ArrayList<>();
        for (Good good : treeList) {
            if (good.getChildren() != null && good.getChildren().size() > 0){
                resList.addAll(tree2list(good.getChildren()));
            }
            good.setChildren(null);
            resList.add(good);
        }
        return resList;
    }
}

http://www.niftyadmin.cn/n/5266389.html

相关文章

【vim 学习系列文章 13.1 -- 自动命令autocmd 根据文件类型设置vim参数】

文章目录 autocmd 根据文件类型配置vim参数vim 文本类型 autocmd 根据文件类型配置vim参数 在 Vim 中&#xff0c;你可以使用 autocmd &#xff08;自动命令&#xff09;来根据文件类型自动执行特定的函数。首先&#xff0c;你需要定义这些函数&#xff0c;然后使用 autocmd 与…

net实践记录

文章目录 前言是否使用继承快捷输入 实体&#xff1b;引用class&#xff0c;提示有保护性System.NullReferenceException:“未将对象引用设置到对象的实例。” 总结 前言 记录使用.net 项目开发过程基础问题记录&#xff0c;便于快速回顾与查询&#xff1b; 是否使用继承 快捷…

Python:如何将MCD12Q1\MOD11A2\MOD13A2原始数据集批量输出为TIFF文件(镶嵌/重投影/)?

博客已同步微信公众号&#xff1a;GIS茄子&#xff1b;若博客出现纰漏或有更多问题交流欢迎关注GIS茄子&#xff0c;或者邮箱联系(推荐-见主页). 00 前言 之前一段时间一直使用ENVI IDL处理遥感数据&#xff0c;但是确实对于一些比较新鲜的东西IDL并没有python那么好的及时性&…

软件测试求职面试必看!大厂黄金面试法则

软件测试求职面试必看 Web自动化面试题详解 你觉得web自动化测试的价值在哪 自动化测试 模拟手工操作 使用机器代替人工有很多繁杂的工作 比如参数比较多的页面流程测试 需要进行多次测试 自动化的方式完成自动化测试对于回归测试意义重大 如何在公司项目中开展web自动化测…

spring-cloud-stream-kafka生产速度慢

包版本spring-cloud-starter-stream-kafka:3.1.0 修改yaml配置 添加poller配置

C_13练习题答案

一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上 以下叙述不正确的是(C)。A.C程序中,语句之间必须用分号分隔。 B.C程序中,多行语句可以写在一行上。 C.C程序中,可以不必包…

超全面网络安全学习知识——(黑客)自学

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防…

Ubuntu下COLMAP的编译与安装全攻略

文章目录 一、前言二、安装依赖库基本的依赖安装Ceres Solver安装不需要cuda支持需要cuda支持 三、编译colmap四、运行colmap五、总结 一、前言 在计算机视觉领域&#xff0c;colmap是一款功能强大的开源图像重建工具。它提供了包括SfM&#xff08;Structure from Motion&…