摘要:經(jīng)過分析和思考,我決定不采用遞歸的方式來編寫樹形數(shù)據(jù)的處理,最終選用來維護樹節(jié)點之間的關(guān)系。以權(quán)限樹為例,做一個樹形數(shù)據(jù)工具類的設(shè)計。
1.簡介
? 在一些管理系統(tǒng)中一般都會用到,會用到一些樹形數(shù)據(jù),例如部門組織以及權(quán)限等數(shù)據(jù),都得生成樹形數(shù)據(jù),需要寫一些樹形數(shù)據(jù)生成工具,一般使用遞歸的方式,性能低下還可能會導(dǎo)致爆棧。經(jīng)過分析和思考,我決定不采用遞歸的方式來編寫樹形數(shù)據(jù)的處理,最終選用hasMap來維護樹節(jié)點之間的關(guān)系。以權(quán)限樹為例,做一個樹形數(shù)據(jù)工具類的設(shè)計。
2.數(shù)據(jù)庫表設(shè)計SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for permission -- ---------------------------- DROP TABLE IF EXISTS `permission`; CREATE TABLE `permission` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT "權(quán)限id", `name` varchar(32) NOT NULL COMMENT "權(quán)限名稱", `url` varchar(64) DEFAULT NULL COMMENT "資源url", `type` int(11) NOT NULL COMMENT "權(quán)限類型,1:模塊,2:菜單,3:url資源", `parent_id` int(11) NOT NULL DEFAULT "0" COMMENT "上級資源id", `icon` varchar(64) DEFAULT NULL COMMENT "菜單圖標(biāo)", `sort` int(11) DEFAULT NULL COMMENT "排序", `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "創(chuàng)建時間", `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "更新時間", `operator` varchar(32) DEFAULT NULL COMMENT "操作者", `level` int(11) NOT NULL DEFAULT "0", `code` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;3.java Bean設(shè)計
java bean的設(shè)計依據(jù)數(shù)據(jù)庫的表來進行設(shè)計,構(gòu)造方法以及get、set方式使用lombok注解。
package com.lk.permission.common.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; import lombok.experimental.Accessors; import java.util.ArrayList; import java.util.Date; import java.util.List; //@SuppressWarnings("serail") @ToString @NoArgsConstructor @AllArgsConstructor @Data @Accessors(chain = true) public class Permission { /** 權(quán)限ID */ private Integer id; /** 權(quán)限名稱 */ private String name; /** 權(quán)限編碼 */ private String code; /** 菜單圖標(biāo) */ private String icon; /** 資源類型 */ private Integer type; /** 資源地址 */ private String url; /** 層級 */ private Integer level; /** 上層ID */ private Integer parentId; /** 排序 */ private Integer sort; /** 創(chuàng)建時間 */ private Date createTime; /** 更新時間 */ private Date updateTime; /** 操作人員 */ private String operator; /** 下級權(quán)限 */ private List4. 樹形工具類設(shè)計subPermissions = new ArrayList<>(); }
我只提供一個實現(xiàn)思路,具體可根據(jù)自己業(yè)務(wù)實現(xiàn),通過hasMap方式,一個是性能有了較大的提升,另一個不用擔(dān)心爆棧的風(fēng)險。下面維護關(guān)系已經(jīng)給出,可進行適當(dāng)?shù)母脑靵韺崿F(xiàn)自己具體業(yè)務(wù)需求。
package com.lk.permission.system.service.impl; import com.lk.permission.common.pojo.Permission; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class TreeService { private Map5.實現(xiàn)的一些測試效果map; private List permissions; /** * 初始化多叉樹 * @param permissions */ TreeService(List permissions){ this.permissions = permissions; this.map = new HashMap<>(); for (Permission permission : permissions){ this.map.put(permission.getId(),permission); } createTree(); } /** * 創(chuàng)建多叉樹 */ private void createTree(){ for (Permission permission : this.permissions){ if (this.map.containsKey(permission.getParentId())){ this.map.get(permission.getParentId()).getSubPermissions().add(permission); System.out.println(permission.toString()); } } } /** * 根據(jù)層級獲取多叉樹 * @param level * @return */ List getPermissionsByLevel(Integer level){ return this.permissions.parallelStream().filter(permission -> permission.getLevel() == level).collect(Collectors.toList()); } /** * 根據(jù)樹的id獲取多叉樹 * @param id * @return */ Permission getPermissionById(Integer id){ return this.map.get(id); } /** * 向多叉樹添加子節(jié)點 * @param permission */ public void addChild(Permission permission){ if (this.map.containsKey(permission.getParentId())){ ((Permission)this.map.get(permission.getParentId())).getSubPermissions().add(permission); } this.map.put(permission.getId(),permission); } }
權(quán)限選擇
樹形表格
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75682.html
摘要:二項目中用到的幾個經(jīng)典的遞歸求的和分析假設(shè)遞歸函數(shù)已經(jīng)寫好為,即,就是求的和。遞歸函數(shù)實現(xiàn)每天凌晨定時啟動定時器執(zhí)行代碼分析假設(shè)遞歸函數(shù)已經(jīng)寫好了。 一、遞歸的概念 在程序中函數(shù)直接或者間接調(diào)用自身的一種方法,就叫做遞歸。它通常把一個大型復(fù)雜的問題轉(zhuǎn)化為一個與原問題相似的規(guī)模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程中所需要的多次重復(fù)計算,大大減少了程序的代碼了。 二、...
摘要:今天就來跟大家分享一下工作中用到的幾款插件。是一款功能強大的網(wǎng)頁調(diào)試與發(fā)送網(wǎng)頁請求的插件。俗稱油猴子,是一款功能非常強大的插件,他包含方便的腳本管理腳本概覽設(shè)置多樣性腳本自動更新安全兼容性同步編輯器語法檢查快速開發(fā)卸載等功能。 ‘工欲善其事,必先利其器’。優(yōu)秀的開發(fā)者不僅體現(xiàn)在其在技術(shù)方面的精通,還體現(xiàn)在其對各種開發(fā)工具的充分了解與使用,這會讓其開發(fā)效率事半功倍。作為一個前端開發(fā)者,平...
摘要:今天就來跟大家分享一下工作中用到的幾款插件。是一款功能強大的網(wǎng)頁調(diào)試與發(fā)送網(wǎng)頁請求的插件。俗稱油猴子,是一款功能非常強大的插件,他包含方便的腳本管理腳本概覽設(shè)置多樣性腳本自動更新安全兼容性同步編輯器語法檢查快速開發(fā)卸載等功能。 ‘工欲善其事,必先利其器’。優(yōu)秀的開發(fā)者不僅體現(xiàn)在其在技術(shù)方面的精通,還體現(xiàn)在其對各種開發(fā)工具的充分了解與使用,這會讓其開發(fā)效率事半功倍。作為一個前端開發(fā)者,平...
摘要:今天就來跟大家分享一下工作中用到的幾款插件。是一款功能強大的網(wǎng)頁調(diào)試與發(fā)送網(wǎng)頁請求的插件。俗稱油猴子,是一款功能非常強大的插件,他包含方便的腳本管理腳本概覽設(shè)置多樣性腳本自動更新安全兼容性同步編輯器語法檢查快速開發(fā)卸載等功能。 ‘工欲善其事,必先利其器’。優(yōu)秀的開發(fā)者不僅體現(xiàn)在其在技術(shù)方面的精通,還體現(xiàn)在其對各種開發(fā)工具的充分了解與使用,這會讓其開發(fā)效率事半功倍。作為一個前端開發(fā)者,平...
閱讀 1599·2021-09-23 11:21
閱讀 2357·2021-09-07 10:13
閱讀 843·2021-09-02 10:19
閱讀 1139·2019-08-30 15:44
閱讀 1732·2019-08-30 13:18
閱讀 1920·2019-08-30 11:15
閱讀 1115·2019-08-29 17:17
閱讀 2024·2019-08-29 15:31