Java如何处理数据成为树状结构
更新时间:2024年07月25日 16:57:13 作者:骑猪撞地球QAQ
这篇文章主要介绍了Java如何处理数据成为树状结构问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
Java处理数据成为树状结构
如题所示,项目中需要将部分数据处理成为树状结构
实现过程
注:也可以使用sql达到该目的,但此处数据不多,故在代码中处理,主要是sql处理不是很会
// 获取需要封装的数据
List<Data> dataAll = service.findAll();
if (CollUtil.isEmpty(dataAll)) {
return new ArrayList<>();
}
// 获取顶层目录 项目中上级编码为空则为一级目录
List<Data> parentList = dataAll.stream()
.filter(item -> ObjectUtil.isEmpty(item.getParentNumber())).collect(Collectors.toList());
// 获取下级目录,上级编码不为空则非一级目录
List<Data> childList = dataAll.stream()
.filter(item -> ObjectUtil.isNotEmpty(item.getParentNumber())).collect(Collectors.toList());
// 封装树状结构
return parentList.stream().map(item1 -> {
Data chapterVo = new Data();
BeanUtils.copyProperties(item1, chapterVo);
List<Data> videoVoList = childList.stream()
.filter(item2 -> item1.getBackgroundManagementCategoryNumber().equals(item2.getParentNumber()))
.map(item3 -> {
Data videoVo = new Data();
BeanUtils.copyProperties(item3, videoVo);
return videoVo;
})
.collect(Collectors.toList());
chapterVo.setChildren(videoVoList);
return chapterVo;
}).collect(Collectors.toList());
Java将查出来的数据拼树
递归方法构建树
/**
* 使用递归方法建树
* @param menuTrees 子节点集合 / 返回的数据
* @return List
*/
public static List<Dept> buildByRecursive(List<Dept> menuTrees) {
List<Dept> trees = new ArrayList<>();
for (Dept menuTree : menuTrees) {
//查找根节点
if (menuTree.getPcode() == null) {
trees.add(findChildren(menuTree,menuTrees));
}
}
return trees;
}/**
* 递归查找子节点
* @param menuTree 菜单数对象
* @param menuTrees 子节点
* @return MenuTree
*/
private static Dept findChildren(Dept menuTree,List<Dept> menuTrees){
for (Dept it : menuTrees) {
if(menuTree.getCode().equals(it.getPcode())) {
if (menuTree.getChildren() == null) {
menuTree.setChildren(new ArrayList<>());
}
menuTree.getChildren().add(findChildren(it,menuTrees));
}
}
return menuTree;
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringValidation自定义注解及分组校验功能详解
这篇文章主要介绍了SpringValidation自定义注解及分组校验功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧2024-01-01
SpringBoot中实现订单30分钟自动取消的三种方案分享
在电商和其他涉及到在线支付的应用中,通常需要实现一个功能:如果用户在生成订单后的一定时间内未完成支付,系统将自动取消该订单,本文将详细介绍基于Spring Boot框架实现订单30分钟内未支付自动取消的几种方案,并提供实例代码,需要的朋友可以参考下2023-10-10
Java AQS(AbstractQueuedSynchronizer)源码解析
AbstractQueuedSynchronizer被称为队列同步器,简称为大家熟知的AQS,这个类可以称作concurrent包的基础。本文将通过剖析源码来看看AQS是如何工作的,感兴趣的可以了解一下2023-02-02


最新评论