首页 > 其他分享 >treeutil工具类

treeutil工具类

时间:2024-10-24 09:09:58浏览次数:1  
标签:item List tree param childList setSubChildren treeutil 工具

原文链接


/**
 * @Description: 树操作方法工具类
 * @Author: 公众号:赵侠客
 * @Copyright: Copyright (c) 赵侠客
 * @Date: 2024-07-22 10:42
 * @Version: 1.0
 */
public class TreeUtil {

    /**
     * 将list合成树
     *
     * @param list 需要合成树的List
     * @param rootCheck 判断E中为根节点的条件,如:x->x.getPId()==-1L , x->x.getParentId()==null,x->x.getParentMenuId()==0
     * @param parentCheck 判断E中为父节点条件,如:(x,y)->x.getId().equals(y.getPId())
     * @param setSubChildren   E中设置下级数据方法,如: Menu::setSubMenus
     * @param <E>  泛型实体对象
     * @return   合成好的树
     */
    public static <E> List<E> makeTree(List<E> list, Predicate<E> rootCheck, BiFunction<E, E, Boolean> parentCheck, BiConsumer<E, List<E>> setSubChildren) {
        return list.stream().filter(rootCheck).peek(x -> setSubChildren.accept(x, makeChildren(x, list, parentCheck, setSubChildren))).collect(Collectors.toList());
    }


    /**
     *  将树打平成tree
     * @param tree  需要打平的树
     * @param getSubChildren  设置下级数据方法,如: Menu::getSubMenus,x->x.setSubMenus(null)
     * @param setSubChildren 将下级数据置空方法,如: x->x.setSubMenus(null)
     * @return  打平后的数据
     * @param <E> 泛型实体对象
     */
    public static <E> List<E> flat(List<E> tree, Function<E, List<E>> getSubChildren, Consumer<E> setSubChildren) {
        List<E> res = new ArrayList<>();
        forPostOrder(tree, item -> {
            setSubChildren.accept(item);
            res.add(item);
        }, getSubChildren);
        return res;
    }


    /**
     * 前序遍历
     *
     * @param tree 需要遍历的树
     * @param consumer  遍历后对单个元素的处理方法,如:x-> System.out.println(x)、 System.out::println打印元素
     * @param setSubChildren  设置下级数据方法,如: Menu::getSubMenus,x->x.setSubMenus(null)
     * @param <E> 泛型实体对象
     */
    public static <E> void forPreOrder(List<E> tree, Consumer<E> consumer, Function<E, List<E>> setSubChildren) {
        for (E l : tree) {
            consumer.accept(l);
            List<E> es = setSubChildren.apply(l);
            if (es != null && es.size() > 0) {
                forPreOrder(es, consumer, setSubChildren);
            }
        }
    }


    /**
     * 层序遍历
     *
     * @param tree 需要遍历的树
     * @param consumer 遍历后对单个元素的处理方法,如:x-> System.out.println(x)、 System.out::println打印元素
     * @param setSubChildren 设置下级数据方法,如: Menu::getSubMenus,x->x.setSubMenus(null)
     * @param <E> 泛型实体对象
     */
    public static <E> void forLevelOrder(List<E> tree, Consumer<E> consumer, Function<E, List<E>> setSubChildren) {
        Queue<E> queue = new LinkedList<>(tree);
        while (!queue.isEmpty()) {
            E item = queue.poll();
            consumer.accept(item);
            List<E> childList = setSubChildren.apply(item);
            if (childList != null && !childList.isEmpty()) {
                queue.addAll(childList);
            }
        }
    }


    /**
     * 后序遍历
     *
     * @param tree 需要遍历的树
     * @param consumer 遍历后对单个元素的处理方法,如:x-> System.out.println(x)、 System.out::println打印元素
     * @param setSubChildren 设置下级数据方法,如: Menu::getSubMenus,x->x.setSubMenus(null)
     * @param <E> 泛型实体对象
     */
    public static <E> void forPostOrder(List<E> tree, Consumer<E> consumer, Function<E, List<E>> setSubChildren) {
        for (E item : tree) {
            List<E> childList = setSubChildren.apply(item);
            if (childList != null && !childList.isEmpty()) {
                forPostOrder(childList, consumer, setSubChildren);
            }
            consumer.accept(item);
        }
    }

    /**
     * 对树所有子节点按comparator排序
     *
     * @param tree 需要排序的树
     * @param comparator  排序规则Comparator,如:Comparator.comparing(MenuVo::getRank)按Rank正序 ,(x,y)->y.getRank().compareTo(x.getRank()),按Rank倒序
     * @param getChildren 获取下级数据方法,如:MenuVo::getSubMenus
     * @return 排序好的树
     * @param <E> 泛型实体对象
     */
    public static <E> List<E> sort(List<E> tree, Comparator<? super E> comparator, Function<E, List<E>> getChildren) {
        for (E item : tree) {
            List<E> childList = getChildren.apply(item);
            if (childList != null && !childList.isEmpty()) {
                sort(childList,comparator,getChildren);
            }
        }
        tree.sort(comparator);
        return tree;
    }
    
    private static <E> List<E> makeChildren(E parent, List<E> allData, BiFunction<E, E, Boolean> parentCheck, BiConsumer<E, List<E>> children) {
        return allData.stream().filter(x -> parentCheck.apply(parent, x)).peek(x -> children.accept(x, makeChildren(x, allData, parentCheck, children))).collect(Collectors.toList());
    }
}


标签:item,List,tree,param,childList,setSubChildren,treeutil,工具
From: https://www.cnblogs.com/jqccan/p/18498827

相关文章

  • 自动化测试工具Ranorex Studio(十三)-录制过程中
    点击“录制”按钮来触发创建一个新的录制模块。 图:点击“Record”开始录制点击录制按钮后,Ranorex会在正式录制之前协助你运行一个应用程序,打开浏览器浏览导航到特定的URL或打开移动设备上的应用程序。因此,像双击桌面快捷方式图标这样的操作就没有必要录制了。通过选择’gl......
  • 阿里巴巴推出升级版AI翻译工具:Marco MT 性能超越Google、DeepL和ChatGPT
    阿里巴巴的国际业务部门于推出了一款升级版的AI翻译工具,名为MarcoMT。这款工具在翻译性能上超越了Google、DeepL和ChatGPT的同类产品。该工具的目标是帮助商户更好地在全球市场销售,尤其是在跨境电商领域,通过更加精准的翻译增强商户的国际竞争力。基于大语言模型:MarcoMT使......
  • GiliSoft Video Editor v18.2 激活版 (视频剪辑工具)
    几乎每个人都能拍摄视频,无论是用数码相机、智能手机还是专业摄像机,但直接观看原始视频往往缺乏趣味。GiliSoft视频编辑器能够帮助您制作引人入胜的剪辑影片,支持零质量损失地裁剪和合并视频片段,应用时尚的视频效果和滤镜,还可以添加音乐、标题等元素!一、下载地址链接:GiliSoftVide......
  • 【2024】Adobe AI(Illustrator)绘制和编辑、排版工具软件下载安装
    目录一、AdobeAI(Illustrator)软件发展历史1.起源与早期发展2.中期扩展与突破3.近期创新与融合4.下载链接二、AdobeAI(Illustrator)软件功能介绍1.矢量绘图与设计2.排版与出版3.图像上色与特效三、AdobeAI(Illustrator)软件系统要求1.操作系统与处理器2.内存......
  • 【网络安全 渗透工具】Hydra工具安装、使用详析
    接着在当前目录中进入cmd:输入:hydra-h若出现正常回显,则说明安装成功。使用详析常见参数Hydra是一个命令行工具,所有的操作都是通过命令和参数实现的,见下表:选项说明-R继续上一次破解-I忽略现有还原文件(不等待10秒)-sPORT指定端口(无-s则表示指定默认端口)-lLOGIN指......
  • 中国大学mooc慕课视频课件课程下载工具,如何在电脑端下载中国大学mooc慕课视频课程课件
    一.安装中国大学mooc慕课课程下载器1.获取学无止下载器https://www.xuewuzhi.cn/icourse163_downloader 2.下载安装后,然后点击桌面快捷方式运行即可。注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。二.使用说明1.学无......
  • 如何选择最好的硬盘恢复工具? 6 个硬盘数据恢复软件对比!
    硬盘非常高效,但其紧凑的设计使它们在计算机上容易不可读。幸运的是,通过各种技术方法很容易使闪存硬盘数据恢复过程。只需尝试本文中推荐的6款最佳硬盘恢复软件。这些桌面应用程序不仅使硬盘的数据恢复变得像点击几下一样简单,而且其中一些甚至提供免费帮助。让我们更进一......
  • 下载并部署数据自动标注工具X-AnyLabeling
    目录项目介绍代码下载与环境配置使用自动标注导入自己模型标注效果展示官方连接:https://github.com/CVHub520/X-AnyLabeling如果打不开官方连接可以直接下载上方☝我的文件夹。项目介绍    此项目是用于数据方面的标注工具,其包含目标检测、关键点检测、文字......
  • [Ansible实践笔记]自动化运维工具Ansible(一):初探ansible&ansible的点对点模式
    文章目录Ansible介绍核心组件任务执行方式实验前的准备更新拓展安装包仓库在ansible主机上配置ip与主机名的对应关系生成密钥对将公钥发送到被管理端,实现免密登录测试一下是否实现免密登录常用工具ansibleansible—docansible—playbook主要配置文件Ansible模块配置......
  • 真心安利所有老师都去用这个AI工具!!!
    让我看看还有谁在加班写教案、教学计划、家访记录blabla一系列材料呢!看到这里你的福气就来了!AI时代,有的苦咱们真的不必吃!“笔墨写作”AI产品——真正的新质生产力。集AI写教案、教学计划、主题班会策划书、教研记录、家访记录以及海量教案课件、免费PPT/展板模板等功能于一身......