开发企业后台管理应用时,经常会遇到一种场景:在树结构上做模糊查询。
比如:公司组织架构树、分类树等,通常是在页面上的文本框中输入一个关键字,例如"数据",然后在公司组织架构树中过滤出名字包含数据的部门,且保持树结构不变。
公司的一级部门、二级部门、三级部门等等,名字都有可能包含"数据",比如一级部门叫大数据部门,二级部门叫数据分析部门或数据开发部门等等,这些都是符合要求的。

下面我将造出一个简单的分类树,并实现在树结构上模糊查询的功能(这里为了简单,将树的层级固定为三级,但实际上树的层级是未知的且远远不止三级,那就需要用到递归了)。
分类实体:

class Category{private String name;private List<Category> children;public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Category> getChildren() {return children;}public void setChildren(List<Category> children) {this.children = children;}
}

分类树json格式的数据[tree.json]:

[{"name": "JAVA","children": [{"name": "JAVA程序员","children": [{"name": "开发工程师"},{"name": "技术总监"}]},{"name": "JAVA大数据","children": [{"name": "离线处理"},{"name": "实时处理"}]},{"name": "JAVA架构","children": [{"name": "高可用架构"},{"name": "高并发架构"}]}]},{"name": "大数据工程师","children": [{"name": "大数据开发","children": [{"name": "离线计算"},{"name": "实时计算"}]},{"name": "大数据运维","children": [{"name": "平台搭建"},{"name": "数据指标监控"}]},{"name": "大数据分析","children": [{"name": "用户画像分析"},{"name": "数据指标分析"}]}]}
]

main方法:

// 读取json文件,将其反序列化为Java的List对象StringBuilder sb = new StringBuilder();BufferedReader reader = new BufferedReader(new InputStreamReader(Test.class.getResourceAsStream("/tree.json")));String line;while (null != (line = reader.readLine())){sb.append(line).append("\n");}reader.close();List<Category> oneCategoryList = JSONArray.parseArray(sb.toString(), Category.class);// 定义模糊查询关键词String keyword = "开发";// 树结构模糊查询核心逻辑treeMatch(oneCategoryList,keyword);// 输出模糊查询后的树的样子System.out.println(JSONArray.toJSONString(oneCategoryList));

三级树结构模糊查询核心逻辑:

public static void treeMatch(List<Category> oneCategoryList,String keyword){Iterator<Category> oneIter = oneCategoryList.iterator();while (oneIter.hasNext()){Category oneCategory = oneIter.next();// 如果包含则什么也不做(不移除),否则就看二级目录if(!oneCategory.getName().contains(keyword)){List<Category> twoCategoryList = oneCategory.getChildren();Iterator<Category> twoIter = twoCategoryList.iterator();while (twoIter.hasNext()){Category twoCategory = twoIter.next();// 如果包含则什么也不做(不移除),否则就看三级目录if(!twoCategory.getName().contains(keyword)){List<Category> threeCategoryList = twoCategory.getChildren();Iterator<Category> threeIter = threeCategoryList.iterator();while (threeIter.hasNext()){Category threeCategory = threeIter.next();if(!threeCategory.getName().contains(keyword)){threeIter.remove();}}// 三级目录看完了,如果三级目录全部被移除,则移除二级目录if(CollectionUtils.isEmpty(twoCategory.getChildren())){twoIter.remove();}}}// 二级目录看完了,如果二级目录全部被移除,则移除一级目录if(CollectionUtils.isEmpty(oneCategory.getChildren())){oneIter.remove();}}}}

当关键字为"开发时",运行程序,得到的结果如下。

[{"children": [{"children": [{"name": "开发工程师"}],"name": "JAVA程序员"}],"name": "JAVA"},{"children": [{"children": [{"name": "离线计算"},{"name": "实时计算"}],"name": "大数据开发"}],"name": "大数据工程师"}
]

本人已经验证过是没有问题的,如果疑问欢迎指正。

下面给出递归方式模糊查询的代码。

/*** 递归方法* @param anyLevelCategoryList 任意层级的目录集合* @param keyword 关键字*/public static void treeMatch(List<Category> anyLevelCategoryList, String keyword){Iterator<Category> iter = anyLevelCategoryList.iterator();while (iter.hasNext()){// 获取当前遍历到的目录Category category = iter.next();// 如果当前目录名称包含关键字,则什么也不做(不移除),否则就看下一级if(!category.getName().contains(keyword)){// 取出下一级目录集合List<Category> childrenCategoryList = category.getChildren();// 递归if(!CollectionUtils.isEmpty(childrenCategoryList)){treeMatch(childrenCategoryList,keyword);}// 下一级目录看完了,如果下一级目录全部被移除,则移除当前目录if(CollectionUtils.isEmpty(category.getChildren())){iter.remove();}}}}

输入数据格式如下:

假如查询的关键字是“曹”,运行,输出结果如下。

验证通过。

Java后台管理应用:如何在树结构上做模糊查询?相关推荐

  1. 旅游订票订酒店团购(APP,JAVA后台管理,MYSQL)

    旅游订票订酒店团购(APP,JAVA后台管理,MYSQL)(毕业论文近11000字以上,共39页, 包含程序代码,MySql数据库,数据库脚本) [功能描述] 旅游订票订酒店团购(APP,JAVA后台 ...

  2. Java 后台管理开发框架!CURD 一键生成,再也不要重复搬砖了!

     主流技术框架 技术特色 代码片段 系统展示 高大上的登录界面 开发工具基本配置 CURD属性配置 CURD一键生成 角色编辑 微信设置 微信状态查看 树形演示实体 管理员列表 存储插件列表 二维 ...

  3. java中如何做模糊查询_到底Java里的模糊查询语句该怎么写

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 现在String sql="select * from car where carName like '%'+?+'%'";可以查询出 ...

  4. 上传文件java后台获取为空_java图片上传,通过MultipartFile方式,如果后台获取null检查是否缺少步骤...

    本方法基于springMvc 1.首先需要在webap下创建images 2.在springmvc.xml上引入 3.配置web.xml过滤器 4.后台代码 import org.springfram ...

  5. java后台管理页面_一个很不错的,代码简单的后台管理界面

    无标题文档 body{font-size:12px;} ul,li,h2{margin:0;padding:0;} ul{list-style:none;} #top{width:900px;heig ...

  6. java 后台管理模板_后台管理系统模板 - WEB源码|JSP源码/Java|源代码 - 源码中国

    文件名大小更新时间 ccps_7_H-ui.admin.page_3.002018-11-26 ccps_7_H-ui.admin.page_3.0\3000套网站模板免费拥有.url1732018- ...

  7. Java之对List里面的对象名字进行模糊查询

    1 问题 对list里面的对象名字进行模糊查询 2 解决办法 //即可以进行模糊匹配matcher.find()//匹配查询matcher.matches() /*** 模糊查询*/public st ...

  8. Java后台微信点餐小程序开发最新版笔记,Springboot+Mysql+Freemarker+Bootstrap+微信小程序实现扫码点餐小程序,包含语音提示,微信消息推送,网页管理后台

    由于之前的Java后台微信点餐小程序有些知识点过时了,所以今天重新出一版,把里面过时的知识点更新下 前五章是部署笔记,后面是知识点的详细讲解,大家可以先看部署笔记,部署起来后,再跟着详细知识学习. 第 ...

  9. 微擎 人人商城 对接京东vop 对接京东商品,同步商品 地址,库存,价格,上下架等。(二)上 设置后台管理界面...

    昨天提到了,由于vop商品池未开通,故对接工作只能暂缓,现在要做一个专门针对vop商品的后台管理, 老规矩,先上设计链路图 因为后台本来就是有比较完善的商品管理系统, 所以我们只是针对vop 进行简单 ...

最新文章

  1. COMET | 概念学习使机器具有人的思维方式
  2. python散点图拟合曲线-使用python通过点拟合曲线
  3. [AngularJS] Reusable directive, require from parent controller
  4. java 左移 返回值_java左移右移运算符详解
  5. mysql锿法_MySQL基本用法
  6. es查询所欲_Elasticsearch基本查询总结
  7. swiper4.0(移动端)轮播图 - 案例篇
  8. 学习hadoop需要什么基础
  9. QTTabBar——Windows多功能标签软件
  10. vue项目SEO优化
  11. torch.masked_select()和Tensor.masked_scatter()的用法
  12. 5.系统设计的工作内容与技能工具有哪些?
  13. 真的来了,浏览器端可以直接运行Python了
  14. 智慧园区数据可视化大屏的优势分析
  15. 普元中间件部署应用程序
  16. 电子商务多平台运营与实践课程设计
  17. HTTPS安全通讯 1. 密码学基础
  18. Linux下挂载移动硬盘和USB的方法
  19. 1月14日科技资讯|京东回应「被薅 7000 万、项目组全体开除」;微信朋友圈屏蔽支付宝集五福;MySQL 8.0.19 发布
  20. 【总结】2023数学建模美赛!收官!

热门文章

  1. 北京筑龙:采购供应链平台-构建能源企业数智供应链的必经之路
  2. 怎么把java设置高性能_2021-2-19:请问你知道 Java 如何高性能操作文件么?
  3. 【应用】博图SCL语言之抢答器应用
  4. php fetchall用法,PHP利用fetchAll()与MySQL_fetch_array()用法示例
  5. 【材料】北大深研院杨世和教授课题组JACS:碗烯铵盐对钙钛矿表面的重构助力器件光伏性能的提升...
  6. 射频去读计算机的博士,欧洲的射频工程师很牛 那里的博士都学哪些课
  7. LabVIEW控制Arduino实现模拟数据采集(基础篇—8)
  8. 大数据架构、大数据开发与数据分析的区别
  9. python使用nibabel和sitk读取保存nii.gz文件
  10. vipjr口碑真实情况,学员妈妈深度访谈聊一聊!