国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

項目中用到的樹形數(shù)據(jù)

douzifly / 422人閱讀

摘要:經(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 List subPermissions = new ArrayList<>();
}
4. 樹形工具類設(shè)計

我只提供一個實現(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 Map 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);
    }


}
5.實現(xiàn)的一些測試效果

權(quán)限選擇

樹形表格

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75682.html

相關(guān)文章

  • javascript中的遞歸

    摘要:二項目中用到的幾個經(jīng)典的遞歸求的和分析假設(shè)遞歸函數(shù)已經(jīng)寫好為,即,就是求的和。遞歸函數(shù)實現(xiàn)每天凌晨定時啟動定時器執(zhí)行代碼分析假設(shè)遞歸函數(shù)已經(jīng)寫好了。 一、遞歸的概念 在程序中函數(shù)直接或者間接調(diào)用自身的一種方法,就叫做遞歸。它通常把一個大型復(fù)雜的問題轉(zhuǎn)化為一個與原問題相似的規(guī)模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程中所需要的多次重復(fù)計算,大大減少了程序的代碼了。 二、...

    acrazing 評論0 收藏0
  • 推薦幾款好用的Chrome插件

    摘要:今天就來跟大家分享一下工作中用到的幾款插件。是一款功能強大的網(wǎng)頁調(diào)試與發(fā)送網(wǎng)頁請求的插件。俗稱油猴子,是一款功能非常強大的插件,他包含方便的腳本管理腳本概覽設(shè)置多樣性腳本自動更新安全兼容性同步編輯器語法檢查快速開發(fā)卸載等功能。 ‘工欲善其事,必先利其器’。優(yōu)秀的開發(fā)者不僅體現(xiàn)在其在技術(shù)方面的精通,還體現(xiàn)在其對各種開發(fā)工具的充分了解與使用,這會讓其開發(fā)效率事半功倍。作為一個前端開發(fā)者,平...

    fox_soyoung 評論0 收藏0
  • 推薦幾款好用的Chrome插件

    摘要:今天就來跟大家分享一下工作中用到的幾款插件。是一款功能強大的網(wǎng)頁調(diào)試與發(fā)送網(wǎng)頁請求的插件。俗稱油猴子,是一款功能非常強大的插件,他包含方便的腳本管理腳本概覽設(shè)置多樣性腳本自動更新安全兼容性同步編輯器語法檢查快速開發(fā)卸載等功能。 ‘工欲善其事,必先利其器’。優(yōu)秀的開發(fā)者不僅體現(xiàn)在其在技術(shù)方面的精通,還體現(xiàn)在其對各種開發(fā)工具的充分了解與使用,這會讓其開發(fā)效率事半功倍。作為一個前端開發(fā)者,平...

    lpjustdoit 評論0 收藏0
  • 推薦幾款好用的Chrome插件

    摘要:今天就來跟大家分享一下工作中用到的幾款插件。是一款功能強大的網(wǎng)頁調(diào)試與發(fā)送網(wǎng)頁請求的插件。俗稱油猴子,是一款功能非常強大的插件,他包含方便的腳本管理腳本概覽設(shè)置多樣性腳本自動更新安全兼容性同步編輯器語法檢查快速開發(fā)卸載等功能。 ‘工欲善其事,必先利其器’。優(yōu)秀的開發(fā)者不僅體現(xiàn)在其在技術(shù)方面的精通,還體現(xiàn)在其對各種開發(fā)工具的充分了解與使用,這會讓其開發(fā)效率事半功倍。作為一個前端開發(fā)者,平...

    wums 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<