最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)樹形菜單的方法總結(jié)

 更新時(shí)間:2023年08月30日 10:46:40   作者:一只愛擼貓的程序猿  
當(dāng)我們想要展示層級(jí)結(jié)構(gòu),如文件目錄、組織結(jié)構(gòu)或分類目錄時(shí),樹形菜單是一個(gè)直觀且有效的解決方案,本文為大家整理了java中幾種常見方法,希望對(duì)大家有所幫助

當(dāng)我們想要展示層級(jí)結(jié)構(gòu),如文件目錄、組織結(jié)構(gòu)或分類目錄時(shí),樹形菜單是一個(gè)直觀且有效的解決方案。在Java中,有多種方式可以實(shí)現(xiàn)樹形菜單,本文將介紹其中幾種常見方法,并配有示例代碼。

1. 使用遞歸法

遞歸法是最直觀的實(shí)現(xiàn)樹形菜單的方法。我們先定義節(jié)點(diǎn)結(jié)構(gòu),然后通過遞歸方式構(gòu)建每一個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)。

實(shí)例代碼

class TreeNode {
    int id;
    int parentId;
    String name;
    List<TreeNode> children;
    // 構(gòu)造函數(shù)、getters、setters省略
}
public List<TreeNode> buildTree(List<TreeNode> nodes, int parentId) {
    List<TreeNode> tree = new ArrayList<>();
    for (TreeNode node : nodes) {
        if (node.parentId == parentId) {
            node.children = buildTree(nodes, node.id);
            tree.add(node);
        }
    }
    return tree;
}

2. 使用隊(duì)列法 (層次遍歷)

使用隊(duì)列實(shí)現(xiàn)樹形菜單可以有效減少遞歸的深度,特別是在樹形結(jié)構(gòu)很深的情況下。

實(shí)例代碼

public List<TreeNode> buildTreeWithQueue(List<TreeNode> nodes) {
    if (nodes == null || nodes.isEmpty()) {
        return Collections.emptyList();
    }
    Map<Integer, TreeNode> nodeMap = nodes.stream().collect(Collectors.toMap(TreeNode::getId, node -> node));
    List<TreeNode> tree = new ArrayList<>();
    Queue<TreeNode> queue = new LinkedList<>(nodes);
    while (!queue.isEmpty()) {
        TreeNode node = queue.poll();
        if (node.parentId == 0) {
            tree.add(node);
        } else {
            TreeNode parent = nodeMap.get(node.parentId);
            if (parent.children == null) {
                parent.children = new ArrayList<>();
            }
            parent.children.add(node);
        }
    }
    return tree;
}

3. 使用Map索引優(yōu)化

通過使用Map進(jìn)行索引,可以提高搜索效率,特別是當(dāng)節(jié)點(diǎn)數(shù)量非常多時(shí)。

實(shí)例代碼

public List<TreeNode> buildTreeWithMap(List<TreeNode> nodes) {
    Map<Integer, List<TreeNode>> childrenMap = new HashMap<>();
    List<TreeNode> rootNodes = new ArrayList<>();
    for (TreeNode node : nodes) {
        if (node.parentId == 0) {
            rootNodes.add(node);
        } else {
            childrenMap
                .computeIfAbsent(node.parentId, k -> new ArrayList<>())
                .add(node);
        }
    }
    for (TreeNode rootNode : rootNodes) {
        rootNode.children = getChildren(rootNode.id, childrenMap);
    }
    return rootNodes;
}
private List<TreeNode> getChildren(int parentId, Map<Integer, List<TreeNode>> childrenMap) {
    List<TreeNode> children = childrenMap.get(parentId);
    if (children != null) {
        for (TreeNode child : children) {
            child.children = getChildren(child.id, childrenMap);
        }
    }
    return children;
}

4. 數(shù)據(jù)庫的樹形編碼的方式

步驟1: 創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu)

首先,我們需要一個(gè)數(shù)據(jù)庫表來存儲(chǔ)節(jié)點(diǎn)數(shù)據(jù):

CREATE TABLE tree_nodes (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    path VARCHAR(255) DEFAULT '',
    parent_id INT
);

其中,path字段用于存儲(chǔ)從根節(jié)點(diǎn)到當(dāng)前節(jié)點(diǎn)的路徑,如1/3/5/。

步驟2: Java 數(shù)據(jù)模型

我們需要一個(gè)Java類來表示數(shù)據(jù)庫中的節(jié)點(diǎn):

public class TreeNode {
    private int id;
    private String name;
    private String path;
    private int parentId;
    // Getter, Setter 和 Constructor
}

步驟3: 插入節(jié)點(diǎn)

插入一個(gè)新的節(jié)點(diǎn)時(shí),我們需要計(jì)算它的路徑:

public void addNode(String name, int parentId, Connection connection) throws SQLException {
    String path;
    if (parentId == 0) {
        path = "/";
    } else {
        String parentPathQuery = "SELECT path FROM tree_nodes WHERE id = ?";
        try (PreparedStatement stmt = connection.prepareStatement(parentPathQuery)) {
            stmt.setInt(1, parentId);
            ResultSet rs = stmt.executeQuery();
            if (rs.next()) {
                path = rs.getString("path") + parentId + "/";
            } else {
                throw new SQLException("Parent not found");
            }
        }
    }
    String insertQuery = "INSERT INTO tree_nodes (name, path, parent_id) VALUES (?, ?, ?)";
    try (PreparedStatement stmt = connection.prepareStatement(insertQuery)) {
        stmt.setString(1, name);
        stmt.setString(2, path);
        stmt.setInt(3, parentId);
        stmt.executeUpdate();
    }
}

步驟4: 獲取某節(jié)點(diǎn)的所有子節(jié)點(diǎn)

public List<TreeNode> getChildren(int nodeId, Connection connection) throws SQLException {
    List<TreeNode> children = new ArrayList<>();
    String pathQuery = "SELECT path FROM tree_nodes WHERE id = ?";
    String path;
    try (PreparedStatement stmt = connection.prepareStatement(pathQuery)) {
        stmt.setInt(1, nodeId);
        ResultSet rs = stmt.executeQuery();
        if (rs.next()) {
            path = rs.getString("path") + nodeId + "/";
        } else {
            throw new SQLException("Node not found");
        }
    }
    String childrenQuery = "SELECT * FROM tree_nodes WHERE path LIKE ?";
    try (PreparedStatement stmt = connection.prepareStatement(childrenQuery)) {
        stmt.setString(1, path + "%");
        ResultSet rs = stmt.executeQuery();
        while (rs.next()) {
            TreeNode node = new TreeNode();
            node.setId(rs.getInt("id"));
            node.setName(rs.getString("name"));
            node.setPath(rs.getString("path"));
            node.setParentId(rs.getInt("parent_id"));
            children.add(node);
        }
    }
    return children;
}

總結(jié)

以上我們介紹了三種在Java中實(shí)現(xiàn)樹形菜單的方法,從基礎(chǔ)的遞歸法、隊(duì)列法到使用Map進(jìn)行優(yōu)化。根據(jù)實(shí)際需求和數(shù)據(jù)量大小,你可以選擇合適的方法進(jìn)行實(shí)現(xiàn)。不過,無論使用哪種方法,都要確保理解樹形結(jié)構(gòu)的基礎(chǔ)原理和具體實(shí)現(xiàn)細(xì)節(jié),以確保代碼的正確性和效率。 還有一種是路徑枚舉方式的一個(gè)簡(jiǎn)單例子,它已經(jīng)足夠用于實(shí)際應(yīng)用。當(dāng)然,還有許多細(xì)節(jié)可以優(yōu)化,如路徑長(zhǎng)度限制、節(jié)點(diǎn)移動(dòng)等。而其他的樹形編號(hào)方法,如嵌套集模型和閉包表,會(huì)有更復(fù)雜的邏輯。但總的來說,理解核心概念并將其應(yīng)用于實(shí)際代碼是關(guān)鍵。

到此這篇關(guān)于Java實(shí)現(xiàn)樹形菜單的方法總結(jié)的文章就介紹到這了,更多相關(guān)Java樹形菜單內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java面向?qū)ο缶幊填惖膬?nèi)聚性分析

    java面向?qū)ο缶幊填惖膬?nèi)聚性分析

    高內(nèi)聚、低耦合是軟件設(shè)計(jì)中非常關(guān)鍵的概念。在面向?qū)ο蟪绦蛟O(shè)計(jì)中類的劃分時(shí),類的內(nèi)聚性越高,其封裝性越好,越容易復(fù)用
    2021-10-10
  • Java數(shù)據(jù)結(jié)構(gòu)之順序表和鏈表精解

    Java數(shù)據(jù)結(jié)構(gòu)之順序表和鏈表精解

    我在學(xué)習(xí)完順序表后一直對(duì)順序表和鏈表的概念存在一些疑問,這里給出一些分析和看法,通讀本篇對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Javaweb 鼠標(biāo)移入移出表格顏色變化的實(shí)現(xiàn)

    Javaweb 鼠標(biāo)移入移出表格顏色變化的實(shí)現(xiàn)

    這篇文章主要介紹了Javaweb 鼠標(biāo)移入移出表格顏色變化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java面向?qū)ο筮x擇題總結(jié)歸納

    Java面向?qū)ο筮x擇題總結(jié)歸納

    今天小編就為大家分享一篇關(guān)于Java面向?qū)ο筮x擇題總結(jié)歸納,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • jpa使用manyToOne(opntional=true)踩過的坑及解決

    jpa使用manyToOne(opntional=true)踩過的坑及解決

    這篇文章主要介紹了jpa使用manyToOne(opntional=true)踩過的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • idea導(dǎo)入工程時(shí)不能導(dǎo)入maven項(xiàng)目不能加入tomcatServer的原因

    idea導(dǎo)入工程時(shí)不能導(dǎo)入maven項(xiàng)目不能加入tomcatServer的原因

    這篇文章主要介紹了idea導(dǎo)入工程時(shí)不能導(dǎo)入maven項(xiàng)目不能加入tomcatServer的原因及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • JDK8新出Optional類的方法探索與思考分析

    JDK8新出Optional類的方法探索與思考分析

    這篇文章主要為大家介紹了JDK8新出Optional類的發(fā)方法示例探索與思考分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Java線程池FutureTask實(shí)現(xiàn)原理詳解

    Java線程池FutureTask實(shí)現(xiàn)原理詳解

    這篇文章主要介紹了Java線程池FutureTask實(shí)現(xiàn)原理詳解,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • java泛型常用通配符實(shí)例解析

    java泛型常用通配符實(shí)例解析

    這篇文章主要介紹了java泛型常用通配符實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 一文搞懂Java?JDBC中的SQL注入問題

    一文搞懂Java?JDBC中的SQL注入問題

    在用戶輸入的數(shù)據(jù)中有SQL關(guān)鍵字或語法,并且關(guān)鍵字或語法參與了SQL語句的編譯,導(dǎo)致SQL語句編譯后的條件為true,一直得到正確的結(jié)果,這種現(xiàn)象就是SQL注入,這篇文章主要介紹了一文搞懂Java?JDBC中的SQL注入問題,需要的朋友可以參考下
    2022-10-10

最新評(píng)論

沈丘县| 衡南县| 全椒县| 宁乡县| 邢台市| 林周县| 潜山县| 宕昌县| 景德镇市| 郎溪县| 东乡| 湘潭县| 马关县| 城步| 莱阳市| 韩城市| 泗洪县| 平远县| 育儿| 湘潭市| 东安县| 马山县| 株洲市| 黎川县| 靖州| 新干县| 大悟县| 英山县| 旌德县| 兴隆县| 白城市| 北安市| 吉林市| 江西省| 安徽省| 连云港市| 大理市| 潮州市| 吴川市| 林州市| 南漳县|