【java】生成树形结构及条件搜索

java中使用递归快速构建树形数据结构

1,数据表设计

在设计表时每个记录中应添加parentId字段,用于标识父子关系。

2,实体类

java 复制代码
public class Entity {

	private Long id;

	private Long parentId;

	private List<Entity> children = Lists.newArrayList();
	
	// 省略其他属性及get、set方法
	
}

3,service

java 复制代码
// 常量 标识第一层级的父id
	private final static Long ROOT_PARENT_ID = 0L;
	
	/**
	 * 获取树形结构
	 * @param condition 筛选条件
	 * @return
	 */
	public List<Entity> loadTreeData(Condition condition) {
		List<Entity> entityList = this.dealTreeData(ROOT_PARENT_ID,condition);
		return entityList;
	}

	private List<Entity> dealTreeData(Long parentId,condition condition){
		// 获取所有的数据表记录
		List<Entity> allItems = EntityMapper.getAllItems();
		if(CollectionUtils.isEmpty(allItems)) {
			return Lists.newArrayList();
		}
		// 递归方法
		List<Entity> tree = this.getTree(allItems, parentId);
		// 条件筛选
		this.treeMatch(tree,condition);
		return tree;
	}

	private List<Entity> getTree(List<Entity> allItems,Long parentId){
		List<Entity> tree = new ArrayList<>();
		for(Entity entity:allItems){
			if(entity.getParentId() == parentId){
				entity.setChildren(getTree(allItems,entity.getId()));
				tree.add(entity);
			}
		}
		return tree;
	}

	public void treeMatch(List<Entity> allTree, condition condition){
		Iterator<Entity> iter = allTree.iterator();
		while (iter.hasNext()){
			// 获取当前遍历到的目录
			Entity entity = iter.next();
			boolean shouldRemove = true;
			// 如果当前目录名称包含关键字,则什么也不做(不移除),否则就看下一级
			if(StringUtils.hasText(condition.getCondition1()) && !entity.getCondition1().equals(condition.getCondition1())){
				// 取出下一级目录集合
				List<Entity> childrenList = entity.getChildren();
				// 递归
				if(!CollectionUtils.isEmpty(childrenList)){
					treeMatch(childrenList,condition);
				}
			} else if(StringUtils.hasText(condition.getCondition2()) && !entity.getCondition2().equals(condition.getCondition2())){
				// 取出下一级目录集合
				List<Entity> childrenList = entity.getChildren();
				// 递归
				if(!CollectionUtils.isEmpty(childrenList)){
					treeMatch(childrenList,condition);
				}

			} else {
				shouldRemove = false;
			}

			// 下一级目录看完了,如果下一级目录全部被移除,则移除当前目录
			if(CollectionUtils.isEmpty(entity.getItems()) && shouldRemove){
				iter.remove();
			}

		}
	}
相关推荐
golang学习记几秒前
IDEA 2026.3 远程开发迎来重磅升级
java·ide·intellij-idea·远程开发
天天被压力21 分钟前
【A股分钟级高频数据完全手册 #04】指数分钟级行情数据接口:沪深指数Pro版最新分时取数
java·人工智能·python
敲代码的小小酥24 分钟前
谈SpringMVC与Spring WebFlux的区别与适用场景
java·后端·spring
天天被压力31 分钟前
【A股分钟级高频数据完全手册 #03】股票历史1分钟K线数据接口怎么用:Pro版批量拉取与本地缓存
java·人工智能·python
zhanghaha131433 分钟前
C# 系列教程_7 判断语句(分支)保姆级精讲
开发语言·c#
apcipot_rain37 分钟前
C++转Java日记(02)
java·开发语言·c++
nice_lcj5201 小时前
【从零理解 Spring AI · 03】Spring AI 在 Spring 生态里的位置
java·spring boot·大模型·spring ai·ai应用开发
杜 硕1 小时前
从零开始的C++生活——第七讲——02
开发语言·c++·生活
zhanghaha13141 小时前
C# 系列教程_8 循环语句 保姆级精讲(面向新手)
开发语言·c#
麦麦麦当劳大王9 小时前
【油猴脚本】Boss直聘 岗位职责复制
开发语言·前端·javascript