当前位置: 首页 > news >正文

java之树筛选

 树结构:

@Data
public class TreeNode {/*** 主键*/private String id;/*** 名称*/private String name;/*** 父节点id 最上层的父节点为0*/private String parentId;private List<TreeNode> children;
}

方法1:

public List<TreeNode> findTree(List<TreeNode> list, String keyword) {List<TreeNode> newNodes = new ArrayList<>();List<TreeNode> hitList = list.stream().filter(item -> item.getName().contains(keyword)).collect(Collectors.toList());Map<String, TreeNode> map = list.stream().collect(Collectors.toMap(TreeNode::getId, Function.identity()));for (TreeNode currentNode : hitList) {if (!newNodes.contains(currentNode)) {newNodes.add(currentNode);do {currentNode = map.get(currentNode.getParentId());if (null != currentNode) {if (newNodes.contains(currentNode)) {break;} else {newNodes.add(currentNode);}}} while (!"0".equals(currentNode.getParentId()));}}return newNodes;
}

方法2: 

public static List<TreeNode> findTree(List<TreeNode> treeDtoList, String keyword) {//最后返回的筛选完成的集合List<TreeNode> screeningOfCompleteList = new ArrayList<>();if (CollectionUtils.isNotEmpty(treeDtoList) && StringUtils.isNotBlank(keyword)) {for (TreeNode treeDto : treeDtoList) {//递归筛选完成后的返回的需要添加的数据TreeNode addTreeDto = getSubsetPmsPlanPo(treeDto, keyword);if (null != addTreeDto) {screeningOfCompleteList.add(addTreeDto);}}return screeningOfCompleteList;}return null;
}/*** 筛选符合的集合并返回** @param treeDto 树形类* @param keyword 筛选条件* @return 筛选成功的类*/
public static TreeNode getSubsetPmsPlanPo(TreeNode treeDto,String keyword) {String nodeName = treeDto.getName(); //筛选条件if (CollectionUtils.isNotEmpty(treeDto.getChildren())) { //有子集时List<TreeNode> addTreeDtoList = new ArrayList<>(); // 符合筛选条件的子集for (TreeNode subsetTreeDto : treeDto.getChildren()) {// 继续向下寻找筛选符合的集合TreeNode newTreeDto = getSubsetPmsPlanPo(subsetTreeDto, keyword);if (null != newTreeDto) { //当子集筛选完不为空时添加addTreeDtoList.add(newTreeDto);}}if (CollectionUtils.isNotEmpty(addTreeDtoList)) {//符合筛选条件的子集不为空时// 替换子集集合内容并返回当前对象treeDto.setChildren(addTreeDtoList);return treeDto;} else if (CollectionUtils.isEmpty(addTreeDtoList) && nodeName.contains(keyword)) { ///符合筛选条件的子集为空且当前对象符合筛选条件// 返回当前对象return treeDto;} else {  //子集及当前对象不符合筛选条件return null;}} else { //无子集时,判断当前对象是否符合筛选条件if (nodeName.contains(keyword)) {return treeDto;} else {return null;}}
}

参考

Java递归实现树结构遍历展示以及条件筛选_递归展示树形结构-CSDN博客

 JAVA根据条件检索对树进行筛选_java中树结构展示中怎么根据条件进行筛选-CSDN博客

相关文章:

  • 判断电话号码是否重复-excel
  • x-cmd pkg | openssl - 密码学开源工具集
  • 【JavaFX】基于JavaFX11 构建可编辑、对象存储、修改立即保存、支持条件过滤的TableView
  • LeetCode976. Largest Perimeter Triangle
  • docker +gitee+ jenkins +maven项目 (一)
  • C语言 指针初阶
  • 【Redis-08】Redis主从复制的实现原理
  • Linux驱动开发之杂项设备注册和Linux2.6设备注册
  • Android IdleHandler闲时加载
  • 《Python机器学习原理与算法实现》学习笔记
  • redis—List列表
  • MySQL:主从复制
  • 【项目】玩具租赁博客测试报告
  • 每日一题(LeetCode)----二叉树-- 二叉树的右视图
  • 【智慧门店】东胜物联蓝牙网关助力解决方案商,推动汽车后市场企业智能化升级
  • ES6指北【2】—— 箭头函数
  • [译]前端离线指南(上)
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • TypeScript实现数据结构(一)栈,队列,链表
  • vue学习系列(二)vue-cli
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 学习笔记:对象,原型和继承(1)
  • 阿里云API、SDK和CLI应用实践方案
  • #### go map 底层结构 ####
  • #HarmonyOS:Web组件的使用
  • #职场发展#其他
  • (26)4.7 字符函数和字符串函数
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (三)终结任务
  • (生成器)yield与(迭代器)generator
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (一)Neo4j下载安装以及初次使用
  • (状压dp)uva 10817 Headmaster's Headache
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .net中的Queue和Stack
  • 。Net下Windows服务程序开发疑惑
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @NestedConfigurationProperty 注解用法
  • [20150904]exp slow.txt
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [acm算法学习] 后缀数组SA
  • [Android Pro] Notification的使用
  • [Android]如何调试Native memory crash issue
  • [android学习笔记]学习jni编程
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [CISCN 2019华东南]Web11
  • [codeforces] 25E Test || hash
  • [Django学习]查询过滤器(lookup types)