`
xurichusheng
  • 浏览: 344728 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

【JAVA】组织树

    博客分类:
  • java
阅读更多

 

JDK 版本:jdk 1.8 及以上。

 

1. 组织表结构

   表名  jpf_org



 

2. 组织类属性

   类名 JpfOrgInfo

import java.util.Date;
import java.util.List;

import lombok.Data;
import lombok.EqualsAndHashCode;

@Data
@EqualsAndHashCode(callSuper = false)
public class JpfOrgInfo {

	// 主键id
	private Long id;
	// 组织编号
	private String orgNo;
	// 组织名称
	private String orgName;
	// 父组织编号
	private String parentNo;
	// 层级:C公司,S系统,D部门,A区域,G小组
	private String level;
	// 状态:1正常,2废弃
	private String status;
	// 创建人
	private Long createId;
	// 创建时间
	private Date createTime;
	// 更新人
	private Long updateId;
	// 更新时间
	private Date updateTime;
	// 父组织名称
	private String parentName;
	// 子节点
	private List<JpfOrgInfo> children;
	// 父节点
	private List<JpfOrgInfo> parents;

}

 

3. 组织工具类

   类名  OrgUtils

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class OrgUtils {

	/**
	 * 获取指定组织的所有上级节点
	 * 
	 * @param orgNo 指定组织编号
	 * @param list  所有的组织信息
	 * @return List
	 * @author 
	 * @date 2019年8月29日
	 * @since JDK 1.8
	 */
	public static List<JpfOrgInfo> getParents(String orgNo, List<JpfOrgInfo> list) {

		if (CommonUtil.isBlank(orgNo) || CommonUtil.isBlank(list)) {
			return null;
		}

		Map<String, JpfOrgInfo> map = list.stream()
				.collect(Collectors.toMap(JpfOrgInfo::getOrgNo, a -> a, (k1, k2) -> k1));

		JpfOrgInfo curOrg = map.get(orgNo);

		if (curOrg == null) {
			return null;
		}
		List<JpfOrgInfo> orgList = new ArrayList<>();

		orgList.add(curOrg);

		String parentNo = curOrg.getParentNo();

		// parentNo为空表示递归到了顶层组织
		while (!CommonUtil.isBlank(parentNo) && !Constant.EMPTY_ORG_NO.equals(parentNo)) {
			/* 递归查找每个组织的父级组织,一直到顶层组织 */
			JpfOrgInfo parent = map.get(parentNo);

			orgList.add(parent);

			parentNo = parent.getParentNo();
		}

		return orgList;
	}
	
	/**
	 * 获取指定组织及其所有下级组织
	 * <p>结果包含父级组织</p>
	 * @param pNo  父组织编号
	 * @param list 所有的组织
	 * @return List
	 * @author 
	 * @date 2019年9月4日
	 * @since JDK 1.8
	 */
	public static List<JpfOrgInfo> getChildren(String pNo, List<JpfOrgInfo> list) {

		if (CommonUtil.isBlank(pNo) || CommonUtil.isBlank(list)) {
			return null;
		}
		// 获取指定的父级组织
		List<JpfOrgInfo> roots = list.stream().filter(aa -> (pNo.equals(aa.getOrgNo()))).collect(Collectors.toList());

		if (CommonUtil.isBlank(roots)) {
			return null;
		}
		// 获取子组织
		// List<JpfOrgInfo> subs = list.stream().filter(bb -> (!pNo.equals(bb.getOrgNo()))).collect(Collectors.toList());

		roots.forEach(root -> buildSub(root, list));
		return roots;
	}
	
	private static void buildSub(JpfOrgInfo parent, List<JpfOrgInfo> subs) {
		List<JpfOrgInfo> childs = subs.stream().filter(sub -> (sub.getParentNo().equals(parent.getOrgNo())))
				.collect(Collectors.toList());
		if (!CommonUtil.isBlank(childs)) {
			parent.setChildren(childs);
			childs.forEach(child -> buildSub(child, subs));
		}
	}

	/**
	 * 获取指定组织及其所有下级组织
	 * <p>结果不包含父级组织</p>
	 * 
	 * @param list      所有的组织
	 * @param pNo       父组织编号
	 * @param childMenu 返回值:子组织
	 * @author 
	 * @date 2019年9月4日
	 * @since JDK 1.8
	 */
	public static void getChildren(List<JpfOrgInfo> list, String pNo, List<JpfOrgInfo> childMenu) {

		if (!CommonUtil.isBlank(pNo) && !CommonUtil.isBlank(list)) {

			for (JpfOrgInfo mu : list) {
				// 遍历出父id等于参数的id,add进子节点集合
				if (mu.getParentNo().equals(pNo)) {
					// 递归遍历下一级
					getChildren(list, mu.getOrgNo(), childMenu);
					childMenu.add(mu);
				}
			}
		}
	}
}

 

4. List 转树形结构

private List<JpfOrgInfo> buildTree(List<JpfOrgInfo> list, String orgNo) {

		if (CommonUtil.isBlank(list)) {
			return new ArrayList<>();
		}

		List<JpfOrgInfo> treeList = new ArrayList<>();

		for (JpfOrgInfo org : list) {

			if (CommonUtil.isBlank(org.getParentNo()) || "00000000".equals(org.getParentNo())
					|| orgNo.equals(org.getOrgNo())) {
				// 找到根
				treeList.add(org);
			}
			for (JpfOrgInfo orgNode : list) {
				if (org.getOrgNo().equals(orgNode.getParentNo())) {
					if (CommonUtil.isBlank(org.getChildren())) {
						org.setChildren(new ArrayList<>());
					}
					org.getChildren().add(orgNode);
				}
			}
		}

		return treeList;
	}

 调用  buildTree(list, "");

 

  • 大小: 29.3 KB
1
0
分享到:
评论

相关推荐

    树形结构设计总结java demo

    本篇文章将深入探讨“树形结构设计”在Java环境下的实现,并结合给出的链接资源——一篇在CSDN博客上的文章(虽然无法直接访问,但我们可以根据描述推测其内容),以及名为“tms”的压缩包文件,来解析相关知识点。...

    java简单开发部门树(Tree)

    在Java开发中,构建部门树(Tree)是一个常见的需求,特别是在企业级应用中,用于展示组织结构或权限管理。这个项目提供了从JSP前端到Java后端的完整解决方案,非常适合初学者理解和学习,也能帮助有经验的开发者...

    js+java 完整的树菜单

    在Web开发中,树菜单通常用于展示层级关系的数据,如文件系统、组织结构或者导航菜单。这种数据结构允许用户以折叠/展开的方式浏览多级层次。 【描述】中的"项目可以运行,拥有完整的后台,sql语句,只需通过sql...

    Javatree java树结构

    Java树结构是计算机科学中的一种数据结构,它模拟了自然界中的树形态,通过节点和边来组织数据。在Java编程中,树结构被广泛应用于数据的组织和操作,如文件系统、编译器语法分析、搜索算法等。下面将详细阐述Java树...

    java jquery Ztree 机构人员树示例

    在IT行业中,构建一个高效的组织结构和人员管理系统是至关重要的,而"java jquery Ztree 机构人员树示例"就是一种实现方式。这个示例利用了Java后端技术和前端jQuery库ZTree,来创建一个可交互的、可视化展示机构与...

    java动态树形菜单

    在Java Web开发中,动态树形菜单是一种常见的用户界面元素,尤其在管理系统的导航部分,它能够以层次结构展示数据,使用户能直观地浏览和操作复杂的数据结构。本示例是一个基于Java实现的JSP动态树形菜单功能,旨在...

    java动态树形菜单与分页

    树形菜单是一种层次化的展示数据结构的方式,通常用于表示具有父子关系的数据,如组织架构、文件系统或者导航菜单。在Java中,我们可以使用Java Swing或JavaFX库来创建桌面应用的树形菜单,而在Web应用中,通常会...

    java树形菜单

    在Java编程中,树形菜单是一种常见的用户界面元素,它以层次结构展示数据,通常用于文件系统、组织架构或程序功能导航。这个压缩包“treemenu”很可能包含了一个简单的WinFrom应用程序,其中实现了树形菜单的功能。...

    java-根据过滤条件显示树形结构

    在Java编程中,构建和显示树形结构是一种常见的任务,特别是在数据表示、文件系统操作或者组织复杂的对象层次结构时。本篇文章将详细讲解如何在Java中根据过滤条件来实现这一功能,同时也会提及所需的jar包。 首先...

    基于JAVA建立树形结构的算法优化.pdf

    树形结构是一种在计算机科学和数据管理中广泛应用的非线性数据结构,它模拟了现实世界中实体之间的层级关系,例如公司的组织结构、计算机文件系统的目录结构等。树形结构在程序设计中极为重要,尤其是在需要展示层级...

    java树节点逐级汇总.zip

    在Java编程中,构建树形结构数据是一种常见的需求,特别是在数据组织、文件系统或数据库层次结构的表示中。"java树节点逐级汇总.zip"这个压缩包提供的内容,旨在帮助开发者处理无序列表数据,并将其转化为可以逐级...

    java 标准树结构

    Java标准树结构是一种在编程中广泛使用的数据结构,它基于节点的概念,每个节点可以有零个、一个或多个子节点,形成层次化的组织。在Java中,标准树结构通常指的是`java.util.TreeSet`和`java.util.TreeMap`类,它们...

    Java 无限极 树结构

    在Java编程中,树结构是一种常见的数据结构,用于表示具有层次关系的数据。无限极树结构则是指树的层级没有限制,可以无限扩展。这种结构在实际应用中非常广泛,例如组织架构、文件系统、菜单导航等场景。下面将详细...

    实用的java菜单树

    在IT行业中,尤其是在Web开发领域,菜单树是一种常见的交互元素,用于展示层级关系的数据,比如网站导航、文件系统或者组织结构。"实用的Java菜单树"是一个专为JSP(JavaServer Pages)开发的组件,它能帮助开发者...

    Java目录树控件

    在提供的`java实现系统目录树控件.txt`文件中,可能包含了实现这一功能的具体代码示例,包括如何创建`DirectoryTreeNode`,如何遍历文件系统,以及如何将这些节点组织成`JTree`。通过阅读和理解这个文本文件,你可以...

    Java实现的树以及包含树的内存缓存框架

    java.util竟然没有提供树(数据结构)的实现!让我这种拿来主义的懒人很不开心。 随手写了一个TreeNode,顺道实现了个对应的内存缓存框架,适用于数据量不大,更新也少但是反复要读的数据,比如模块信息/组织结构/...

    java 创建树菜单

    在Java编程语言中,创建树菜单通常涉及到Swing库中的JTree组件。JTree是用于在GUI(图形用户界面)中展示层次结构数据的一种控件,它可以用来模拟文件系统、组织结构或者任何具有层级关系的数据。下面将详细介绍如何...

    java树形控件实现代码

    在Java编程中,树形控件被广泛应用于表示文件系统、组织结构或其他具有层级关系的数据。下面我们将深入探讨如何在Java中实现树形控件及其相关知识点。 1. **JTree类的使用** JTree是Java Swing库中的一个核心组件...

    java 表格树

    在Java编程领域,"表格树"(Treetable)是一种复合控件,它结合了表格(Table)和树形视图(Tree)的功能,能够同时展示数据的层次结构和线性列表。这种组件通常用于数据组织复杂且具有层级关系的情况,如文件系统、...

Global site tag (gtag.js) - Google Analytics