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 ...
随机推荐
- jmeter-jsr223取样器的使用
相比于BeanShell 取样器,JSR223取样器具有可大大提高性能的功能(编译)如果需要,一定要使用JSR223取样器编写脚本是更好的选择!!! 属性描述名称:显示的此取样器的描述性名称,可自定义 ...
- [ABC262E] Red and Blue Graph
Problem Statement You are given a simple undirected graph with $N$ vertices and $M$ edges. The verti ...
- zookeeper JavaApi 删除节点
/* * 删除节点 * 1.删除单个节点 * 2.删除带有子节点的节点 * 3.必须成功的删除 * 4.回调 * * */ @Test public void delete1() throws Exc ...
- Redis入门实践
安装Redis 下载:官网:https://redis.io/download/,选择稳定版下载. 上传至linux 解压Redis:tar -zxvf redis-6.2.7.tar.gz,得到: ...
- Cesium最简单的视效升级方案,无需修改代码即可实现
Cesium依靠其开源免费的特点基本上完全垄断了GIS这一块,并且其中99%的用户都是使用的CesiumJS,然而,对于一些使用Cesium的项目来说,要想升级视效可能需要进行繁琐的代码修改,增加了开 ...
- Javascript Ajax总结——跨域资源共享
XHR对象只能访问与包含它的页面位于同一个中的资源.这种安全策略可以预防某些恶意行为.CORS(Cross-Origin Resource Sharing,跨域资源共享)是W3C的一个工作草案,定义了 ...
- 【Redis】一文掌握Redis原理及常见问题
Redis是基于内存数据库,操作效率高,提供丰富的数据结构(Redis底层对数据结构还做了优化),可用作数据库,缓存,消息中间件等.如今广泛用于互联网大厂,面试必考点之一,本文从数据结构,到集群,到常 ...
- 文心一言 VS 讯飞星火 VS chatgpt (25)-- 算法导论4.2 7题
七.设计算法,仅使用三次实数乘法即可完成复数 a+bi和c+di 相乘.算法需接收a.b.c和d 为输入,分别生成实部 ac-bd 和虚部ad+bc. 文心一言: 可以使用如下算法来计算复数 a+bi ...
- MySQL进阶篇:详解MySQL存储引擎选择
MySQL进阶篇:第一章_一.五_MySQL存储引擎选择 在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎.对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合. InnoDB: ...
- 还在头疼你的API,送你一个保姆级的API设计管理平台
摘要:API设计不一致?API没地方归档?云服务开发项目合作低效?...... ? 本文分享自华为云社区<API Arts 全探秘 | 华为云新一代设计管理平台,功能强大!>,作者:华为云 ...