Java 树形结构数据生成--不需要顶级节点
生活随笔
收集整理的這篇文章主要介紹了
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 树形结构数据生成--不需要顶级节点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员必备注释模板---佛祖保佑
- 下一篇: SpringBoot2.3 修改响应头、