java遞歸獲取部門數(shù)方法
前言
遞歸(Recursion)在編程中是一個(gè)非常重要的概念。簡單來說,遞歸指的是一個(gè)函數(shù)在其定義中直接或間接調(diào)用自身。這種調(diào)用機(jī)制允許函數(shù)通過分解問題為更小的相似子問題來解決復(fù)雜問題。
?遞歸的定義?:
遞歸是一種在函數(shù)定義中調(diào)用函數(shù)自身的方法。它通常包含一個(gè)或多個(gè)基準(zhǔn)情況(base case),用于結(jié)束遞歸調(diào)用鏈,以及一個(gè)或多個(gè)遞歸步驟,用于將問題分解為更小的子問題。
?遞歸的原理?:
1.基準(zhǔn)情況?:這是遞歸調(diào)用的終止條件。當(dāng)滿足基準(zhǔn)情況時(shí),函數(shù)將不再調(diào)用自身,而是返回結(jié)果。
2.遞歸步驟?:在遞歸步驟中,函數(shù)會(huì)調(diào)用自身來解決一個(gè)規(guī)模更小的相似問題。這個(gè)過程會(huì)一直持續(xù),直到達(dá)到基準(zhǔn)情況。
遞歸的示例?:
現(xiàn)在我將獲取部門樹作為示例
1.示例數(shù)據(jù)準(zhǔn)備
/* Navicat Premium Data Transfer Source Server : localhost-本地 Source Server Type : MySQL Source Server Version : 80036 Source Host : localhost:3306 Source Schema : test Target Server Type : MySQL Target Server Version : 80036 File Encoding : 65001 Date: 22/04/2025 01:41:05 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for sys_dept -- ---------------------------- DROP TABLE IF EXISTS `sys_dept`; CREATE TABLE `sys_dept` ( `dept_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '部門id', `parent_id` bigint(0) NULL DEFAULT 0 COMMENT '父部門id', `ancestors` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '祖級(jí)列表', `dept_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '部門名稱', `order_num` int(0) NULL DEFAULT 0 COMMENT '顯示順序', `leader` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '負(fù)責(zé)人', `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '聯(lián)系電話', `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '郵箱', `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '部門狀態(tài)(0正常 1停用)', `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '刪除標(biāo)志(0代表存在 2代表刪除)', `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '創(chuàng)建者', `create_time` datetime(0) NULL DEFAULT NULL COMMENT '創(chuàng)建時(shí)間', `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者', `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新時(shí)間', PRIMARY KEY (`dept_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 210 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '部門表' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sys_dept -- ---------------------------- INSERT INTO `sys_dept` VALUES (100, 0, '0', '中國移動(dòng)', 0, '張三', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-02-17 08:58:32', 'admin', '2025-03-04 10:15:38'); INSERT INTO `sys_dept` VALUES (101, 100, '0,100', '深圳總公司', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-02-17 08:58:32', '', NULL); INSERT INTO `sys_dept` VALUES (102, 100, '0,100', '長沙分公司', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-02-17 08:58:32', '', NULL); INSERT INTO `sys_dept` VALUES (103, 100, '0,100', '研發(fā)部門', 1, '若依', '', '', '0', '0', 'admin', '2025-02-17 08:58:32', 'admin', '2025-03-12 10:26:18'); INSERT INTO `sys_dept` VALUES (104, 101, '0,100,101', '市場部門', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-02-17 08:58:32', '', NULL); INSERT INTO `sys_dept` VALUES (105, 101, '0,100,101', '測試部門', 3, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-02-17 08:58:32', '', NULL); INSERT INTO `sys_dept` VALUES (106, 101, '0,100,101', '財(cái)務(wù)部門', 4, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-02-17 08:58:32', '', NULL); INSERT INTO `sys_dept` VALUES (107, 101, '0,100,101', '運(yùn)維部門', 5, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-02-17 08:58:32', '', NULL); INSERT INTO `sys_dept` VALUES (108, 102, '0,100,102', '市場部門', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-02-17 08:58:32', '', NULL); INSERT INTO `sys_dept` VALUES (109, 102, '0,100,102', '財(cái)務(wù)部門', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-02-17 08:58:32', '', NULL);
2.獲取組裝的部門樹:
public List<SysDept> selectDeptList(SysDept dept) { // 最終的部門樹結(jié)果 List<SysDept> deptTree = new ArrayList<>(); try { // 1.獲取所有部門信息 List<SysDept> sysDebts = sysDeptMapper.selectDeptList(dept); // 2.獲取根節(jié)點(diǎn)的部門信息(parentId=0的部門為根節(jié)點(diǎn)) List<SysDept> rootDept = sysDebts.stream().filter(s-> s.getParentId().equals(0L)) .collect(Collectors.toList()); for (SysDept root : rootDept) { // 3.遞歸獲取子節(jié)點(diǎn) SysDept tree = getChildren(root, sysDebts); // 4.添加到部門樹中 deptTree.add(tree); } return deptTree; } catch (Exception e) { throw new RuntimeException(e); } }
3.遞歸獲取子部門:
/** * 遞歸獲取子節(jié)點(diǎn) * @param rootDept 根節(jié)點(diǎn) * @param sysDepts 所有部門信息 * @return 樹形結(jié)構(gòu)的部門信息 */ private SysDept getChildren(SysDept rootDept, List<SysDept> sysDepts) { ArrayList<SysDept> children = new ArrayList<>(); for (SysDept dept : sysDepts) { if (rootDept.getDeptId().equals(dept.getParentId())){ children.add(getChildren(dept, sysDepts)); } } rootDept.setChildren(children); return rootDept; }
4.接口數(shù)據(jù)返回:
[ { "deptId": 100, "parentId": 0, "ancestors": "0", "deptName": "中國移動(dòng)", "orderNum": 0, "leader": "張三", "phone": "15888888888", "email": "ry@qq.com", "status": "0", "delFlag": "0", "parentName": null, "children": [ { "deptId": 101, "parentId": 100, "ancestors": "0,100", "deptName": "深圳總公司", "orderNum": 1, "leader": "若依", "phone": "15888888888", "email": "ry@qq.com", "status": "0", "delFlag": "0", "parentName": null, "children": [ { "deptId": 104, "parentId": 101, "ancestors": "0,100,101", "deptName": "市場部門", "orderNum": 2, "leader": "若依", "phone": "15888888888", "email": "ry@qq.com", "status": "0", "delFlag": "0", "parentName": null, "children": [], "createBy": "admin", "createTime": "2025-02-17 00:58:32", "updateBy": null, "updateTime": null }, { "deptId": 105, "parentId": 101, "ancestors": "0,100,101", "deptName": "測試部門", "orderNum": 3, "leader": "若依", "phone": "15888888888", "email": "ry@qq.com", "status": "0", "delFlag": "0", "parentName": null, "children": [], "createBy": "admin", "createTime": "2025-02-17 00:58:32", "updateBy": null, "updateTime": null }, { "deptId": 106, "parentId": 101, "ancestors": "0,100,101", "deptName": "財(cái)務(wù)部門", "orderNum": 4, "leader": "若依", "phone": "15888888888", "email": "ry@qq.com", "status": "0", "delFlag": "0", "parentName": null, "children": [], "createBy": "admin", "createTime": "2025-02-17 00:58:32", "updateBy": null, "updateTime": null }, { "deptId": 107, "parentId": 101, "ancestors": "0,100,101", "deptName": "運(yùn)維部門", "orderNum": 5, "leader": "若依", "phone": "15888888888", "email": "ry@qq.com", "status": "0", "delFlag": "0", "parentName": null, "children": [], "createBy": "admin", "createTime": "2025-02-17 00:58:32", "updateBy": null, "updateTime": null } ], "createBy": "admin", "createTime": "2025-02-17 00:58:32", "updateBy": null, "updateTime": null }, { "deptId": 103, "parentId": 100, "ancestors": "0,100", "deptName": "研發(fā)部門", "orderNum": 1, "leader": "若依", "phone": "", "email": "", "status": "0", "delFlag": "0", "parentName": null, "children": [], "createBy": "admin", "createTime": "2025-02-17 00:58:32", "updateBy": null, "updateTime": null }, { "deptId": 102, "parentId": 100, "ancestors": "0,100", "deptName": "長沙分公司", "orderNum": 2, "leader": "若依", "phone": "15888888888", "email": "ry@qq.com", "status": "0", "delFlag": "0", "parentName": null, "children": [ { "deptId": 108, "parentId": 102, "ancestors": "0,100,102", "deptName": "市場部門", "orderNum": 1, "leader": "若依", "phone": "15888888888", "email": "ry@qq.com", "status": "0", "delFlag": "0", "parentName": null, "children": [], "createBy": "admin", "createTime": "2025-02-17 00:58:32", "updateBy": null, "updateTime": null }, { "deptId": 109, "parentId": 102, "ancestors": "0,100,102", "deptName": "財(cái)務(wù)部門", "orderNum": 2, "leader": "若依", "phone": "15888888888", "email": "ry@qq.com", "status": "0", "delFlag": "0", "parentName": null, "children": [], "createBy": "admin", "createTime": "2025-02-17 00:58:32", "updateBy": null, "updateTime": null } ], "createBy": "admin", "createTime": "2025-02-17 00:58:32", "updateBy": null, "updateTime": null } ], "createBy": "admin", "createTime": "2025-02-17 00:58:32", "updateBy": null, "updateTime": null } ]
注意事項(xiàng)?
- ?效率問題?:遞歸可能引發(fā)棧溢出或重復(fù)計(jì)算(如斐波那契數(shù)列的樸素遞歸),需結(jié)合尾遞歸優(yōu)化或動(dòng)態(tài)規(guī)劃改進(jìn)。
- ?理解難度?:需通過“遞進(jìn)+回歸”過程分析,如階乘的逐步展開與回溯。
?總結(jié)?:遞歸是一種強(qiáng)大的編程范式,適用于問題可分解為自相似結(jié)構(gòu)的場景,但需謹(jǐn)慎設(shè)計(jì)終止條件和優(yōu)化性能。
古今成大事者,不唯有超世之才,必有堅(jiān)韌不拔之志!

浙公網(wǎng)安備 33010602011771號(hào)