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 ...
随机推荐
- 现代统计分析软件Datainside在学生成绩分析中的应用
Datainside(薪火数据)是一款非常常用的统计分析软件,广泛应用于学术研究和商业领域. 在学生成绩分析方面,Datainside提供了丰富的功能和工具,可以帮助教育机构和研究人员深入理解学生的学 ...
- Kylin Linux Advanced Server V10 上安装 Nacos详细步骤
要在 Kylin Linux Advanced Server V10 上安装 Nacos,可以按照以下进行操作:1.安装 Java JDK:首先确保已在 Kylin Linux Advanced Se ...
- [ABC262F] Erase and Rotate
Problem Statement You are given a sequence $P = (p_1,p_2,\ldots,p_N)$ that contains $1,2,\ldots,N$ e ...
- spring报错-Caused by: java.lang.IllegalArgumentException: Unsupported class file major version 63
这个错误原因是因为JDK版本过高,改一下版本就行了 把里面的19改成8 这样就行了
- 在 JMeter 中使用 JSON 提取器提取特定条件下的值
当你需要在 JMeter 中对接收到的 JSON 响应进行处理时,JSON 提取器是一个非常有用的工具.在本文中,我们将讨论如何使用 JSON 提取器来提取特定条件下的值,以满足你的需求. 问题描述 ...
- LCIS最长公共上升子序列!HDU-1423
This is a problem from ZOJ 2432.To make it easyer,you just need output the length of the subsequence ...
- Selenium接管已经打开的浏览器并爬取数据
""" P.S:需要接管现有浏览器 ** 使用步骤: 1.打开浏览器,设置好远程调试端口,并扫描登录淘宝. chrome.exe --remote-debugging-p ...
- 反向 Debug 了解一下?揭秘 Java DEBUG 的基本原理
Debug 的时候,都遇到过手速太快,直接跳过了自己想调试的方法.代码的时候吧-- 一旦跳过,可能就得重新执行一遍,准备数据.重新启动可能几分钟就过去了. 好在IDE 们都很强大,还给你后悔的机会,可 ...
- ElasticSearch之配置
ElasticSearch主要的配置文件,如下: elasticsearch.yml,ElasticSearch的相关参数. jvm.options,JVM的相关参数. log4j2.properti ...
- 降低node版本,怎么降低node版本
降低node版本,怎么降低node版本? 部分老旧项目需要使用低版本的node,网上很多是无效的,高版本无法直接安装低版本node,但是低版本nodejs可以安装部分高版本node,从而达到升级效果. ...