日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Java 树形结构数据生成--不需要顶级节点

發布時間:2023/11/28 生活经验 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 树形结构数据生成--不需要顶级节点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概要

樹形結構數據是后臺開發中非常常見的一種數據結構。后臺管理系統中必要的一種結構,常見的樹形結構數據有,部門樹,權限樹等等,利用該數據結構可以讓你的系統數據展示一目了然,并且為分配這些數據也提供了極大地便利。如圖所示的是菜單樹。

菜單選擇樹:

生成前提

這樣的樹通常看起來容易實現,但是實際生成有一定的難度,尤其是沒有頂級節點時(一共n個節點,其中n-1個節點直接或者間接掛在一個節點上的情況),代碼稍稍有點復雜。生成這樣的一棵樹,必須滿足節點有id(節點唯一標識符),pid(父節點的唯一標識符)和子節點集合。用java類可以描述為:

@Data
public class TreeNode {/*** 唯一標識符*/private Long key;/*** 節點描述*/private String title;/*** 父節點唯一標識符*/private Long parentId;/*** 子節點集合*/private List<TreeNode> children;
}

注意: 其中的@Data是Lombok提供的注解,提供了字段的get、set、equals、hashCode、canEqual、toString等方法的生成。如果不了解的同學,自行百度。

生成代碼

如果不漏掉所有的節點,需要先找出所有的父節點

public class Tree {List<TreeNode> nodes;public Tree(List<TreeNode> nodes) {this.nodes = nodes;}/*** 構建樹形結構*/public List<TreeNode> buildTree() {List<TreeNode> treeNodes = new ArrayList<>();List<TreeNode> rootNodes = getRootNodes();for (TreeNode rootNode : rootNodes) {buildChildNodes(rootNode);treeNodes.add(rootNode);}return treeNodes;}/*** 遞歸子節點*/private void buildChildNodes(TreeNode node) {List<TreeNode> children = getChildNodes(node);if (!children.isEmpty()) {for (TreeNode child : children) {buildChildNodes(child);}node.setChildren(children);}}/*** 獲取父節點下所有的子節點*/public List<TreeNode> getChildNodes(TreeNode pNode) {List<TreeNode> childNodes = new ArrayList<>();for (TreeNode n : nodes) {if (pNode.getKey().equals(n.getParentId())) {childNodes.add(n);}}return childNodes;}/*** 判斷是否為根節點*/public boolean rootNode(TreeNode node) {boolean isRootNode = true;for (TreeNode n : nodes) {if (node.getParentId().equals(n.getKey())) {isRootNode = false;break;}}return isRootNode;}/*** 獲取集合中所有的根節點*/public List<TreeNode> getRootNodes() {List<TreeNode> rootNodes = new ArrayList<>();for (TreeNode n : nodes) {if (rootNode(n)) {rootNodes.add(n);}}return rootNodes;}
}

說明

從上面代碼中可以看到,主要有兩個重要的步驟,一、獲取集合中的所有的根節點;二、遞歸子節點。

使用

不難看出該類只有一個構造器,并且構造的時候需要傳入節點集合。

public class Test {public static void main(String[] args) {// 構造節點集合,通常是數據庫中查出List<TreeNode> list = new ArrayList<>();Tree tree = new Tree(list);List<TreeNode> treeNodes = tree.buildTree();}
} 

通常這個生成之后,數據就可以交由前端去渲染。可供常見的前端框架antd,iview等使用,具體情況具體修改。生成已經有了,但是如果只有子節點,如果完整渲染出僅包含該子節點的樹呢?其實思路也是和這個類似的

總結

以上是生活随笔為你收集整理的Java 树形结构数据生成--不需要顶级节点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。