java获取部门树的方法实例
开发中如何获取一个树结构是非常常见的需求,本示例演示一下该功能如何实现。
1、数据准备(mysql)
CREATE TABLE `dept` (
`dept_id` int NOT NULL AUTO_INCREMENT COMMENT 'id值',
`parent_id` int DEFAULT NULL COMMENT '上级部门',
`dept_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '名称',
`sort` int DEFAULT NULL COMMENT '排序',
PRIMARY KEY (`dept_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=212 DEFAULT CHARSET=utf8; INSERT INTO `dept` VALUES ('1', '0', '成都总公司', '1');
INSERT INTO `dept` VALUES ('2', '0', '宜宾分公司', '2');
INSERT INTO `dept` VALUES ('10', '1', '研发部门', '1');
INSERT INTO `dept` VALUES ('11', '1', '市场部门', '2');
INSERT INTO `dept` VALUES ('12', '1', '运维部门', '3');
INSERT INTO `dept` VALUES ('21', '2', '营销部门', '1');
INSERT INTO `dept` VALUES ('22', '2', '运维部门', '2');
INSERT INTO `dept` VALUES ('23', '2', '公关部门', '3');
INSERT INTO `dept` VALUES ('210', '21', '小组1', '2');
INSERT INTO `dept` VALUES ('211', '21', '小组2', '1');
2、工程结构
核心的类就是如下标红的类

3、核心源码
package com.example.demo.unit; import java.util.List;
//实现Comparable接口,重写其CompareTo方法
public class Tree<T> implements Comparable {
String id;
String name;
String parentId;
List<T> children; private Integer order; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getParentId() {
return parentId;
} public void setParentId(String parentId) {
this.parentId = parentId;
} public List<T> getChildren() {
return children;
} public void setChildren(List<T> children) {
this.children = children;
} /**
* @param order
* the order to set
*/
public void setOrder(Integer order) {
this.order = order;
} /**
* @return the order
*/
public Integer getOrder() {
return order;
} //定义排序规则
@Override
public int compareTo(Object o) {
Tree tree =(Tree) o;
return this.getOrder().compareTo(tree.getOrder()); //这里定义你排序的规则。
} @Override
public String toString() {
return "Tree{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", parentId='" + parentId + '\'' +
", children=" + children +
'}';
} }
package com.example.demo.unit; import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors; public class TreeUtils {
//构建部门树方法 没有排序
public static List buildTreeNoSort(List<Tree> trees, String parentId) {
//将每条数据的子节点添加进去
for (Tree tree : trees) {
for (Tree tree1 : trees) {
if (tree1.getParentId().equals(tree.getId())) {
if (tree.getChildren() == null) {
tree.setChildren(new ArrayList());
}
tree.getChildren().add(tree1);
}
}
}
System.out.println(trees);
//把父节点是根节点的数据过滤出来就是最后的树
return trees.stream().filter(tree -> tree.getParentId().equals(parentId)).collect(Collectors.toList());
} //构建部门树方法 有排序
public static List buildTreeSort(List<Tree> trees, String parentId) {
//将每条数据的子节点添加进去
for (Tree tree : trees) {
for (Tree tree1 : trees) {
if (tree1.getParentId().equals(tree.getId())) {
if (tree.getChildren() == null) {
tree.setChildren(new ArrayList());
}
tree.getChildren().add(tree1);
//排序
Collections.sort(tree.getChildren());
}
}
}
System.out.println(trees);
//把父节点是根节点的数据过滤出来就是最后的树
return trees.stream().filter(tree -> tree.getParentId().equals(parentId)).collect(Collectors.toList());
}
}
package com.example.demo.controller; import com.example.demo.domain.Dept;
import com.example.demo.mapper.DeptMapper;
import com.example.demo.unit.Tree;
import com.example.demo.unit.TreeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList;
import java.util.List; @RestController
@RequestMapping("/hello")
public class HelloController { @Autowired
private DeptMapper deptMapper; //获取部门树,没有排序
@GetMapping("/getTreeNoSort")
@ResponseBody
public List<Tree> getTreeNoSort() { List<Dept> list = deptMapper.selectList(null); List<Tree> treeList = new ArrayList<Tree>(); //这样写避免在循环里写Tree tree = new Tree();
Tree tree = null;
for(int i=0;i<list.size();i++){
Dept dept = list.get(i);
//这种写法 仅在内存中保存一份对该对象的引用,而不像Tree tree = new Tree(); 写在循环里会在内存中产生大量的对象引用,浪费大量的内存空间,而且增大了垃圾回收的负荷。
tree = new Tree();
tree.setId(dept.getDeptId());
tree.setName(dept.getDeptName());
tree.setParentId(dept.getParentId());
treeList.add(tree);
}
List<Tree> treeDemo = TreeUtils.buildTreeNoSort(treeList,"0");
return treeDemo;
} //获取部门树有排序功能
@GetMapping("/getTreeSort")
@ResponseBody
public List<Tree> getTreeSort() { List<Dept> list = deptMapper.selectList(null); List<Tree> treeList = new ArrayList<Tree>();
Tree tree = null;
for(int i=0;i<list.size();i++){
Dept dept = list.get(i);
tree = new Tree();
tree.setId(dept.getDeptId());
tree.setName(dept.getDeptName());
tree.setParentId(dept.getParentId());
tree.setOrder(dept.getSort());
treeList.add(tree);
}
List<Tree> treeDemo = TreeUtils.buildTreeSort(treeList,"0");
return treeDemo;
}
}
4、测试
(1)测试没有排序的部门树
http://localhost:8080/hello/getTreeNoSort
[
{
"id": "1",
"name": "成都总公司",
"parentId": "0",
"children": [
{
"id": "10",
"name": "研发部门",
"parentId": "1",
"children": null,
"order": null
},
{
"id": "11",
"name": "市场部门",
"parentId": "1",
"children": null,
"order": null
},
{
"id": "12",
"name": "运维部门",
"parentId": "1",
"children": null,
"order": null
}
],
"order": null
},
{
"id": "2",
"name": "宜宾分公司",
"parentId": "0",
"children": [
{
"id": "21",
"name": "营销部门",
"parentId": "2",
"children": [
{
"id": "210",
"name": "小组1",
"parentId": "21",
"children": null,
"order": null
},
{
"id": "211",
"name": "小组2",
"parentId": "21",
"children": null,
"order": null
}
],
"order": null
},
{
"id": "22",
"name": "运维部门",
"parentId": "2",
"children": null,
"order": null
},
{
"id": "23",
"name": "公关部门",
"parentId": "2",
"children": null,
"order": null
}
],
"order": null
}
]
(2)有排序的部门树
http://localhost:8080/hello/getTreeSort
这里使用了排序算法功能,原始数据如下,小组2排在了小组1前面。
INSERT INTO `dept` VALUES ('210', '21', '小组1', '2');
INSERT INTO `dept` VALUES ('211', '21', '小组2', '1');
[
{
"id": "1",
"name": "成都总公司",
"parentId": "0",
"children": [
{
"id": "10",
"name": "研发部门",
"parentId": "1",
"children": null,
"order": 1
},
{
"id": "11",
"name": "市场部门",
"parentId": "1",
"children": null,
"order": 2
},
{
"id": "12",
"name": "运维部门",
"parentId": "1",
"children": null,
"order": 3
}
],
"order": 1
},
{
"id": "2",
"name": "宜宾分公司",
"parentId": "0",
"children": [
{
"id": "21",
"name": "营销部门",
"parentId": "2",
"children": [
{
"id": "211",
"name": "小组2",
"parentId": "21",
"children": null,
"order": 1
},
{
"id": "210",
"name": "小组1",
"parentId": "21",
"children": null,
"order": 2
}
],
"order": 1
},
{
"id": "22",
"name": "运维部门",
"parentId": "2",
"children": null,
"order": 2
},
{
"id": "23",
"name": "公关部门",
"parentId": "2",
"children": null,
"order": 3
}
],
"order": 2
}
]
java获取部门树的方法实例的更多相关文章
- Java获取各种常用时间方法大全
Java获取各种常用时间方法大全 package cc.javaweb.test; Java中文网,Java获取各种时间大全 import java.text.DateFormat; import j ...
- (转)Java.lang.reflect.Method invoke方法 实例
背景:今天在项目中用到Method 的invoke方法,但是并不理解,查完才知道,原来如此! import java.lang.reflect.Method; /** * Java.lang.refl ...
- java ----获取路径的各种方法(总结)
Java Web开发中路径问题小结 (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 那么针对这个站点的几个基本概念表述如下: 1. web站点的根目录:http: ...
- php 两种获取分类树的方法
php 两种获取分类树的方法 1. /** * 获取分类树 * @param array $array 数据源 * @param int $pid 父级ID * @param int $level 分 ...
- 根据租户id获取部门树状结构有父子结构的数据list
/** * 根据租户id获取部门树状结构 * @param tenantId * @return */ @GetMapping("getDeptTreeList") public ...
- Java 获取当前系统时间方法比较
转载: http://blog.csdn.net/zzjjiandan/article/details/8372617 一. 获取当前系统时间和日期并格式化输出: import java.util.D ...
- java获取当前时间戳的方法
获取当前时间戳 //方法 一 System.currentTimeMillis(); //方法 二 Calendar.getInstance().getTimeInMillis(); //方法 三 n ...
- Java获取文件大小的正确方法(转)
Java中获取文件大小的正确方法 2014-03-28 14:03 64507人阅读 评论(9) 收藏 举报 分类: Java笔记(36) 研究成果(42) 版权声明:本文为博主原创文章,未经博 ...
- java 获取路径的各种方法
(1).request.getRealPath("/");//不推荐使用获取工程的根路径 (2).request.getRealPath(request.getRequestURI ...
- 【转载】java 获取路径的各种方法
转载只供个人学习参考,查看请前往原出处:http://www.cnblogs.com/guoyuqiangf8/p/3506768.html 主要方法有: (1).request.getRealPat ...
随机推荐
- 一次elasticsearch 查询瞬间超时案例分析
大家好,我是蓝胖子,有段时间没有做性能分析案例讲解了,正好前两天碰到一个性能问题,今天就来对它探讨探讨. 问题背景 在晚上9点左右,刚从外面逛街回到家,就接到了电话报警(幸好前不久刚好把电话报警机制加 ...
- 轻量级SpringBoot配置中心 - Minimal-Config
介绍 minimal-config-spring-boot-starter,是基于Spring-Boot原生配置注入实现原理的基础上,拓展的轻量级配置中心,项目体积只有24KB,设计理念为服务中小型项 ...
- .net 温故知新【15】:Asp.Net Core WebAPI 配置
关于Asp.Net Core中的配置实际之前我已经整理过.net 中以json方式进行配置的介绍(.net 温故知新:[8].NET 中的配置从xml转向json),当时我们说Asp.Net Core ...
- [ABC278G] Generalized Subtraction Game
Problem Statement This is an interactive task (where your program interacts with the judge's program ...
- 【论文阅读】HTTP 流量和恶意 URL 的异常检测
Part 1关于论文 基本信息 题目:HTTP 流量和恶意 URL 的异常检测 源码:sec2vec源代码 摘要 在本文中,我们将展示如何利用自然语言处理(NLP)中已知 的方法来检测 HTTP 请求 ...
- 开源不挣钱?这个项目上线半年月入超 30w
很兴奋的告诉大家,Sealos 自从 6 月份上线以来,仅半年时间注册用户已经突破 7万,月收入超过 30w,本文来向大家介绍我们是怎么做开源商业化的.每月平均增速超过 40%,而且这些收入大部分来自 ...
- hdu4365 Palindrome graph
Palindrome graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 华企盾DSC苹果电脑-认证用户提示“不是认证成功的账户”
出现该问题说明客户端连不上服务器,一般来说是网络原因,可按照下面方法排查 1.先检查网络是否通能否正常上网或者换一个网络试试 2.查看服务器是否启动 3.客户测试连接是否成功端口是否填成了5580 ...
- 【Python】【OpenCV】绘制外接矩形、外接圆
外接矩形.外接圆: 1 import cv2 2 import numpy 3 4 img = cv2.imread('../img/img.png', -1) 5 ret, thresh = cv2 ...
- 春秋云镜 - CVE-2022-28060
Victor CMS v1.0 /includes/login.php 存在sql注入 找到页面的登录框,看介绍应该是post类型的表单注入. 上sqlmap用原本的梭发现ctf的那个表是空的,换用- ...