日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

java之TreeUtils生成一切對象樹形結構案例

瀏覽:27日期:2022-08-24 10:01:07

項目中經常會遇到各種需要以樹形結構展示的功能,比較常見的,如菜單樹,分類樹,部門樹等等,如果為每種類型都遍歷遞歸生成樹形結構返回給前端,顯得有些冗余且麻煩,并且其實邏輯都是一致的,只是遍歷的對象不同而已,故其實可以通過面向接口思維,來實現這種通用工具類的實現。

TreeNode用來表示每個樹節點的抽象,即需要生成樹的對象需要實現此接口。

/** * 樹節點父類,所有需要使用{@linkplain TreeUtils}工具類形成樹形結構等操作的節點都需要實現該接口 * * @param <T> 節點id類型 */ public interface TreeNode<T> { /** * 獲取節點id * * @return 樹節點id */ T id(); /** * 獲取該節點的父節點id * * @return 父節點id */ T parentId(); /** * 是否是根節點 * * @return true:根節點 */ boolean root(); /** * 設置節點的子節點列表 * * @param children 子節點 */ void setChildren(List<? extends TreeNode<T>> children); /** * 獲取所有子節點 * * @return 子節點列表 */ List<? extends TreeNode<T>> getChildren(); }

TreeUtils用來生成樹形結構,以及獲取所有葉子節點等操作

/** * 樹形結構工具類 * * @author meilin.huang * @version 1.0 * @date 2019-08-24 1:57 下午 */public class TreeUtils { /** * 根據所有樹節點列表,生成含有所有樹形結構的列表 * * @param nodes 樹形節點列表 * @param <T> 節點類型 * @return 樹形結構列表 */ public static <T extends TreeNode<?>> List<T> generateTrees(List<T> nodes) { List<T> roots = new ArrayList<>(); for (Iterator<T> ite = nodes.iterator(); ite.hasNext(); ) { T node = ite.next(); if (node.root()) {roots.add(node);// 從所有節點列表中刪除該節點,以免后續重復遍歷該節點ite.remove(); } } roots.forEach(r -> { setChildren(r, nodes); }); return roots; } /** * 從所有節點列表中查找并設置parent的所有子節點 * * @param parent 父節點 * @param nodes 所有樹節點列表 */ @SuppressWarnings('all') public static <T extends TreeNode> void setChildren(T parent, List<T> nodes) { List<T> children = new ArrayList<>(); Object parentId = parent.id(); for (Iterator<T> ite = nodes.iterator(); ite.hasNext(); ) { T node = ite.next(); if (Objects.equals(node.parentId(), parentId)) {children.add(node);// 從所有節點列表中刪除該節點,以免后續重復遍歷該節點ite.remove(); } } // 如果孩子為空,則直接返回,否則繼續遞歸設置孩子的孩子 if (children.isEmpty()) { return; } parent.setChildren(children); children.forEach(m -> { // 遞歸設置子節點 setChildren(m, nodes); }); } /** * 獲取指定樹節點下的所有葉子節點 * * @param parent 父節點 * @param <T> 實際節點類型 * @return 葉子節點 */ public static <T extends TreeNode<?>> List<T> getLeafs(T parent) { List<T> leafs = new ArrayList<>(); fillLeaf(parent, leafs); return leafs; } /** * 將parent的所有葉子節點填充至leafs列表中 * * @param parent 父節點 * @param leafs 葉子節點列表 * @param <T> 實際節點類型 */ @SuppressWarnings('all') public static <T extends TreeNode> void fillLeaf(T parent, List<T> leafs) { List<T> children = parent.getChildren(); // 如果節點沒有子節點則說明為葉子節點 if (CollectionUtils.isEmpty(children)) { leafs.add(parent); return; } // 遞歸調用子節點,查找葉子節點 for (T child : children) { fillLeaf(child, leafs); } }}

具體使用方式之聲明樹節點對象

@Getter@Setterpublic class ResourceListVO implements TreeNode<Long> { private Long id; private Long pid; private Integer type; private String name; private String icon; private String code; private Integer status; private List<ResourceListVO> children; @Override public Long id() { return this.id; } @Override public Long parentId() { return this.pid; } @Override public boolean root() { return Objects.equals(this.pid, 0L); } @Override public void setChildren(List children) { this.children = children; }}

具體使用方式之調用

/** * 獲取賬號的資源樹 */ public List<ResourceListVO> listByAccountId(Long accountId) { return TreeUtils.generateTrees(BeanUtils.copyProperties(mapper.selectByAccountId(userId), ResourceListVO.class)); }

通過使用TreeUtils工具可以統一方便地生成一切對象的樹形結構以及其他一些對樹的操作,避免對每個對象都用特定代碼生成。使用起來就是幾個字簡潔方便爽歪歪biu特否。

補充知識:TreeUtil 數據庫菜單生成無限級樹形結構

1、項目需求:

從數據庫從加載所有的菜單出來,菜單中有

id,parentId,name字段

希望能有一個工具幫我進行樹形結構重組;

實例類:

package com.lming.chcservice.util; import lombok.Data; import java.util.List;@Datapublic class TreeNode { /** * 節點id */ private String id; /** * 父節點 默認0為根節點 */ private String parentId; /** * 節點名稱 */ private String name; /** * 是否有子節點 */ private boolean hasChild; public TreeNode(String id, String parentId, String name) { this.id = id; this.parentId = parentId; this.name = name; }}

工具類:

package com.lming.chcservice.util; import java.util.ArrayList;import java.util.LinkedHashMap;import java.util.List;import java.util.Map; /** * 樹形結構工具類 * * 將一組list對象轉成樹形結構 * 該list需符合設定的字段類型 * */public class TreeUtil { public static Map<String,Object> mapArray = new LinkedHashMap<String, Object>(); public List<TreeNode> menuCommon; public List<Object> list = new ArrayList<Object>(); public List<Object> treeMenu(List<TreeNode> menu){ this.menuCommon = menu; for (TreeNode treeNode : menu) { Map<String,Object> mapArr = new LinkedHashMap<String, Object>(); if(treeNode.getParentId().equals('0')){setTreeMap(mapArr,treeNode);list.add(mapArr); } } return list; } public List<?> menuChild(String id){ List<Object> lists = new ArrayList<Object>(); for(TreeNode a:menuCommon){ Map<String,Object> childArray = new LinkedHashMap<String, Object>(); if(a.getParentId() .equals(id)){setTreeMap(childArray,a);lists.add(childArray); } } return lists; } private void setTreeMap(Map<String,Object> mapArr,TreeNode treeNode){ mapArr.put('id', treeNode.getId()); mapArr.put('name', treeNode.getName()); mapArr.put('parentId', treeNode.getParentId()); List<?> childrens = menuChild(treeNode.getId()); if(childrens.size()>0){ mapArr.put('hasChild',true); } else{ mapArr.put('hasChildren',false); } mapArr.put('childrens', menuChild(treeNode.getId())); } public static void main(String[] args){ List<TreeNode> treeNodeList = new ArrayList<>(); TreeNode treeNode1 = new TreeNode('1','0','首頁'); TreeNode treeNode2 = new TreeNode('2','0','訂單'); TreeNode treeNode3 = new TreeNode('3','1','預約'); TreeNode treeNode4 = new TreeNode('4','2','捐獻'); TreeNode treeNode5 = new TreeNode('5','4','我的訂單'); TreeNode treeNode6 = new TreeNode('6','5','個人中心'); TreeNode treeNode7 = new TreeNode('7','6','個人中心2'); TreeNode treeNode8 = new TreeNode('8','99','個人中心3'); treeNodeList.add(treeNode1); treeNodeList.add(treeNode6); treeNodeList.add(treeNode5); treeNodeList.add(treeNode3); treeNodeList.add(treeNode4); treeNodeList.add(treeNode2); treeNodeList.add(treeNode7); treeNodeList.add(treeNode8); TreeUtil treeUtil = new TreeUtil(); System.out.print(JsonUtil.toJson(treeUtil.treeMenu(treeNodeList))); } }

測試結果:

[ { 'id': '1', 'name': '首頁', 'parentId': '0', 'hasChild': true, 'childrens': [ { 'id': '3', 'name': '預約', 'parentId': '1', 'hasChildren': false, 'childrens': [] } ] }, { 'id': '2', 'name': '訂單', 'parentId': '0', 'hasChild': true, 'childrens': [ { 'id': '4', 'name': '捐獻', 'parentId': '2', 'hasChild': true, 'childrens': [ { 'id': '5', 'name': '我的訂單', 'parentId': '4', 'hasChild': true, 'childrens': [ {'id': '6','name': '個人中心','parentId': '5','hasChild': true,'childrens': [ { 'id': '7', 'name': '個人中心2', 'parentId': '6', 'hasChildren': false, 'childrens': [] }] } ] } ] } ] }]

實力類不一致怎么辦? 自己寫一個實體轉換類,將類的對象屬性轉換成上面的實體類,然后在調用,當然最快的方式直接修改實體類即可用。

以上這篇java之TreeUtils生成一切對象樹形結構案例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久一区二区中文字幕| 免费黄网站欧美| 日本va欧美va精品发布| 91国内精品| 国产精品红桃| 亚洲三级精品| 老鸭窝毛片一区二区三区| 亚洲一区网站| 日韩精品免费一区二区夜夜嗨 | 亚洲一区网站| 尤物网精品视频| 综合欧美精品| 国产精品啊啊啊| 99精品小视频| 日韩va亚洲va欧美va久久| 国产高清视频一区二区| 国产综合婷婷| 国产美女精品视频免费播放软件| 国产精品免费精品自在线观看| 三级精品视频| 久久先锋影音| 麻豆91在线播放| 成人小电影网站| 久久亚洲道色| 国产精品毛片视频| 久久久久国产精品一区二区| 92国产精品| 激情综合亚洲| 免费久久99精品国产| 日韩高清在线不卡| 国产成人精品亚洲线观看| 日韩不卡一区| 欧美.日韩.国产.一区.二区| 欧美日韩国产免费观看视频| 亚洲作爱视频| 日本欧美一区二区| 精品国产一区二区三区av片| 久久久久久久久丰满| 久久亚洲影院| 精品一区视频| 久久国产小视频| 亚洲精品国产精品粉嫩| 亚洲综合电影| 日韩av一区二区三区| 日韩av中文字幕一区二区三区| 成年男女免费视频网站不卡| 99riav国产精品| 91综合视频| 免费在线观看日韩欧美| 国产一区二区三区日韩精品| 日韩久久99| 日韩中文字幕区一区有砖一区| 一区二区日韩免费看| 大香伊人久久精品一区二区| 国产一区日韩欧美| 日韩在线一二三区| 精品久久福利| 免播放器亚洲| 日韩在线欧美| 麻豆精品新av中文字幕| 蜜臀国产一区二区三区在线播放| 国产成人精品一区二区三区视频 | 欧美激情日韩| 久久xxxx| 午夜精品成人av| 日韩精品高清不卡| 欧美日韩国产免费观看视频| 国产福利一区二区精品秒拍| 麻豆亚洲精品| av亚洲免费| 新版的欧美在线视频| 欧美激情一区| 国产免费av一区二区三区| 免费在线成人网| 天堂av在线一区| 精品一区亚洲| 欧美好骚综合网| 国产精品亚洲欧美| 亚洲欧美专区| 亚洲日本在线观看视频| 中文字幕中文字幕精品| 久久亚洲美女| 综合欧美精品| 亚洲开心激情| 国产精品97| 狠狠操综合网| 1024精品久久久久久久久| 特黄特色欧美大片| 国户精品久久久久久久久久久不卡| 免费污视频在线一区| 亚洲国产欧美日本视频| 国产欧美一区二区三区精品酒店| 日韩制服丝袜先锋影音| 欧洲精品一区二区三区| 精品国产午夜肉伦伦影院| 国产精品密蕾丝视频下载| 麻豆中文一区二区| 欧美精品不卡| 国产一区日韩| 亚洲人成在线网站| 国产精品毛片在线看| 日韩网站在线| 日韩三级精品| 日产精品一区| 一本综合精品| 国产不卡av一区二区| 国产在线日韩| 国产麻豆久久| 亚洲精选久久| 激情中国色综合| 9国产精品视频| 国产精品任我爽爆在线播放| 精品免费在线| 爽爽淫人综合网网站 | 一区二区日韩免费看| 国产精品1区| 欧美久久精品一级c片| 久久精品凹凸全集| 韩日一区二区三区| 国产精品videosex极品| 粉嫩av一区二区三区四区五区| 国产精品99一区二区三区| 亚洲黄页一区| 91一区二区| 国产精品亚洲成在人线| 亚洲调教视频在线观看| 国产麻豆一区二区三区 | 日韩精品网站| 国产极品模特精品一二| 亚洲欧美日本视频在线观看| 福利一区二区免费视频| 欧美一级久久| 麻豆亚洲精品| 精品欧美久久| 精品国产一区二| 婷婷综合电影| 久久香蕉网站| 国产精品videossex| 欧美一区免费| 亚洲开心激情| 亚洲精品少妇| 亚洲狼人精品一区二区三区| 99日韩精品| 亚洲激情黄色| 亚洲专区在线| 在线亚洲观看| 亚洲欧美日韩视频二区| 99视频精品| 国产美女精品| 日韩av首页| 国产精品一区三区在线观看| 麻豆一区二区三区| 国产一区视频在线观看免费| 亚洲乱码一区| 首页国产精品| 亚洲精品国模| 精品久久久久久久| 亚洲尤物在线| 欧美xxxx性| 亚洲激情黄色| 精品国产乱码久久久| 亚洲作爱视频| 韩日一区二区| 一区二区三区网站| 精品视频一二| 久久不射网站| 日韩在线看片| 久久国产三级精品| 欧美日韩国产在线观看网站 | 久久一级电影| 国产精品sm| 久久aⅴ国产紧身牛仔裤| 国产suv精品一区二区四区视频| 亚洲一区二区免费在线观看| 国产成人精品一区二区三区视频 | 国产免费久久| 午夜一级久久| 视频福利一区| 国产成人精品亚洲线观看| 日本va欧美va精品发布| 国产精品呻吟| 午夜av一区| 99久久九九| 日韩精品久久久久久久电影99爱| 美女性感视频久久| 亚洲无线观看| 久久国产精品久久久久久电车| 亚洲播播91| 色吊丝一区二区| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 日韩高清成人在线| 亚洲免费影院| 视频在线观看91| 国产精品日韩| 九一成人免费视频| 91国语精品自产拍| 欧美精品羞羞答答| 黄色亚洲在线| 男女性色大片免费观看一区二区| 国产亚洲福利|