treeutil工具类

news/2024/10/24 9:23:19

原文链接


/*** @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());}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/75363.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【加密系统】华企盾DSC服务台提示:请升级服务器,否则可能导致客户端退回到旧服务器的版本

华企盾DSC服务台提示:请升级服务器,否则可能导致客户端退回到旧服务器的版本 产生的原因:控制台版本比服务器高导致控制台出现报错解决方案方法:将控制台回退到原来的使用版本,在控制台负载均衡查看连接该服务器各个控制台版本。控制台版本在“关于”中查看,将控制台版本…

设计测试用例编写技巧_

一、查看用例的模板二、用例的要素讲解 .编写用例的要素? 用例编号,用例标题,前置条件,测试步骤,预期结果,优先级 (必写) 系统名称、模块名称、用例创建时间,实际结果,用例类型,执行时间,执行状态等(非必填项) 三、详解测试用例要素 (一)用例编号 可以称为:用…

视觉人体动作行为识别系统

视觉人体动作行为识别系统基于AI视觉智能分析算法,视觉人体动作行为识别系统利用监控摄像头捕捉到的视频数据进行实时分析。通过对工人的操作行为进行识别,系统能够准确判断工人在生产过程中是否存在违规行为或操作错误等情况。例如,系统可以识别工人是否按照正确的顺序执行…

智慧监狱人员行为识别监测系统

智慧监狱人员行为识别监测系统是基于神经网络AI视觉智能分析算法开发的技术。智慧监狱人员行为识别监测系统利用现场监控摄像头,通过对人体活动骨架的结构化分析,根据人体运动轨迹定义了多种异常行为,从而实现对监舍内的静坐不动、离床、攀高、独处;洗手间场景的入厕超时、…

垃圾分类智能监控系统

垃圾分类智能监控系统基于AI视觉智能分析算法,垃圾分类智能监控系统通过现场摄像头对垃圾投放点进行24小时不间断的监控。系统利用智能分析算法,可以实时识别垃圾乱投、垃圾箱满溢、厨余垃圾误时投放等垃圾分类违规投放行为。垃圾分类智能监控系统一旦系统检测到这些违规行为…

2024.7.2

2024.7.2 T1 题面 总共 \(n\) 个数与 \(m\) 个限制,第 \(i\) 个限制给定 \(k_i\) 个数,表示这些数两两不能分为一组,问最少可以分为几组。 \(1\le k\le n\le 10^5,1\le m\le 4\) 题解 把每个人的参赛情况用一个 \([0,15]\) 中的整数 \(s\) 表示,再按照 \(\operatorname{pop…

[快速阅读八] Matlab中bwlookup的实现及其在计算二值图像的欧拉数、面积及其他morph变形中的应用。

以前看过matlab的bwlookup函数,但是总感觉有点神秘,一直没有去仔细分析,最近在分析计算二值图像的欧拉数时,发现自己写的代码和matlab的总是对不少,于是又去翻了下matlab的源代码,看到了matlab里实现欧拉数的代码非常简单,其核心就是借用了bwlookup函数。以前看过matlab…

Ftrans供应链文件分发平台:如何确保数据安全与合规性?

传统制造企业在日常协作中,会涉及到像采购订单和合同、技术规格和图纸、质量标准和检验报告、库存和补货信息等文件分发需求。到在选择供应链文件分发平台时,需要考量以下因素,从而选择出合适的传输方式: 1.安全性:确保文件在传输过程中的安全性是至关重要的。需要考虑传输…