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 ...
随机推荐
- SMTP操作使用详解并通过python进行smtp邮件发送示例
转载请注明出处: 1.SMTP SMTP 的全称是"Simple Mail Transfer Protocol",即简单邮件传输协议.它是一组用于从源地址到目的地址传输 ...
- 向“创新者”升阶,程序员当下如何应对 AI 的挑战
随着 AI 技术的飞速发展,特别是大模型的出现,传统的程序员角色正在经历深刻的变革,我们不得不重新对自己进行审视和思考. 通用领域大模型的"泛化能力" 在过去的二十年内,AI 领域 ...
- Fast ORM 读写分离功能使用方式
Fast Framework 作者 Mr-zhong 代码改变世界.... 一.前言 Fast Framework 基于NET6.0 封装的轻量级 ORM 框架 支持多种数据库 SqlServer O ...
- vertx的学习总结1
一. vertx是什么? 答:lib工具包 二. 为什么要使用vertx 答: 异步和非阻塞:Vert.x 采用了事件驱动和非阻塞的编程模型,可以处理大量并发请求而不会阻塞线程,提供更好的响应 ...
- [ABC264G] String Fair
Problem Statement In a string fair, they determine the beauty of a non-empty string $S$ consisting o ...
- [ABC261G] Replace
Problem Statement You are given two strings \(S\) and \(T\) consisting of lowercase English letters. ...
- C# 提取PDF中指定文本、图片的坐标
获取PDF文件中文字或图片的坐标可以实现精确定位,这对于快速提取指定区域的元素,以及在PDF中添加注释.标记或自动盖章等操作非常有用.本文将详解如何使用国产PDF库通过C# 提取PDF中指定文本或图片 ...
- Chrome扩展开发系列开篇
大家好,我是 dom 哥.这是我关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星. 浏览器现状 研究机构 Statcounter 发布了 2023 年 9 月报告,揭示了有关浏览器的最 ...
- 微调baichuan2-7b遇到的显存坑
问题描述: 微调baichuan2-7b模型,验证一轮后继续训练第一个iteration显存大幅增加 项目链接: https://github.com/wp931120/baichuan_sft_lo ...
- 【笔记整理】requests使用代理
使用proxies参数传递代理信息 import requests if __name__ == '__main__': proxies = { # 这个字典的key不可以乱写,必须是http和htt ...