成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

java之TreeUtils生成一切對(duì)象樹形結(jié)構(gòu)案例

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

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

TreeNode用來表示每個(gè)樹節(jié)點(diǎn)的抽象,即需要生成樹的對(duì)象需要實(shí)現(xiàn)此接口。

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

TreeUtils用來生成樹形結(jié)構(gòu),以及獲取所有葉子節(jié)點(diǎn)等操作

/** * 樹形結(jié)構(gòu)工具類 * * @author meilin.huang * @version 1.0 * @date 2019-08-24 1:57 下午 */public class TreeUtils { /** * 根據(jù)所有樹節(jié)點(diǎn)列表,生成含有所有樹形結(jié)構(gòu)的列表 * * @param nodes 樹形節(jié)點(diǎn)列表 * @param <T> 節(jié)點(diǎn)類型 * @return 樹形結(jié)構(gòu)列表 */ 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);// 從所有節(jié)點(diǎn)列表中刪除該節(jié)點(diǎn),以免后續(xù)重復(fù)遍歷該節(jié)點(diǎn)ite.remove(); } } roots.forEach(r -> { setChildren(r, nodes); }); return roots; } /** * 從所有節(jié)點(diǎn)列表中查找并設(shè)置parent的所有子節(jié)點(diǎn) * * @param parent 父節(jié)點(diǎn) * @param nodes 所有樹節(jié)點(diǎn)列表 */ @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);// 從所有節(jié)點(diǎn)列表中刪除該節(jié)點(diǎn),以免后續(xù)重復(fù)遍歷該節(jié)點(diǎn)ite.remove(); } } // 如果孩子為空,則直接返回,否則繼續(xù)遞歸設(shè)置孩子的孩子 if (children.isEmpty()) { return; } parent.setChildren(children); children.forEach(m -> { // 遞歸設(shè)置子節(jié)點(diǎn) setChildren(m, nodes); }); } /** * 獲取指定樹節(jié)點(diǎn)下的所有葉子節(jié)點(diǎn) * * @param parent 父節(jié)點(diǎn) * @param <T> 實(shí)際節(jié)點(diǎn)類型 * @return 葉子節(jié)點(diǎn) */ public static <T extends TreeNode<?>> List<T> getLeafs(T parent) { List<T> leafs = new ArrayList<>(); fillLeaf(parent, leafs); return leafs; } /** * 將parent的所有葉子節(jié)點(diǎn)填充至leafs列表中 * * @param parent 父節(jié)點(diǎn) * @param leafs 葉子節(jié)點(diǎn)列表 * @param <T> 實(shí)際節(jié)點(diǎn)類型 */ @SuppressWarnings('all') public static <T extends TreeNode> void fillLeaf(T parent, List<T> leafs) { List<T> children = parent.getChildren(); // 如果節(jié)點(diǎn)沒有子節(jié)點(diǎn)則說明為葉子節(jié)點(diǎn) if (CollectionUtils.isEmpty(children)) { leafs.add(parent); return; } // 遞歸調(diào)用子節(jié)點(diǎn),查找葉子節(jié)點(diǎn) for (T child : children) { fillLeaf(child, leafs); } }}

具體使用方式之聲明樹節(jié)點(diǎn)對(duì)象

@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; }}

具體使用方式之調(diào)用

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

通過使用TreeUtils工具可以統(tǒng)一方便地生成一切對(duì)象的樹形結(jié)構(gòu)以及其他一些對(duì)樹的操作,避免對(duì)每個(gè)對(duì)象都用特定代碼生成。使用起來就是幾個(gè)字簡(jiǎn)潔方便爽歪歪biu特否。

補(bǔ)充知識(shí):TreeUtil 數(shù)據(jù)庫(kù)菜單生成無限級(jí)樹形結(jié)構(gòu)

1、項(xiàng)目需求:

從數(shù)據(jù)庫(kù)從加載所有的菜單出來,菜單中有

id,parentId,name字段

希望能有一個(gè)工具幫我進(jìn)行樹形結(jié)構(gòu)重組;

實(shí)例類:

package com.lming.chcservice.util; import lombok.Data; import java.util.List;@Datapublic class TreeNode { /** * 節(jié)點(diǎn)id */ private String id; /** * 父節(jié)點(diǎn) 默認(rèn)0為根節(jié)點(diǎn) */ private String parentId; /** * 節(jié)點(diǎn)名稱 */ private String name; /** * 是否有子節(jié)點(diǎn) */ 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; /** * 樹形結(jié)構(gòu)工具類 * * 將一組list對(duì)象轉(zhuǎn)成樹形結(jié)構(gòu) * 該list需符合設(shè)定的字段類型 * */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','首頁(yè)'); TreeNode treeNode2 = new TreeNode('2','0','訂單'); TreeNode treeNode3 = new TreeNode('3','1','預(yù)約'); TreeNode treeNode4 = new TreeNode('4','2','捐獻(xiàn)'); TreeNode treeNode5 = new TreeNode('5','4','我的訂單'); TreeNode treeNode6 = new TreeNode('6','5','個(gè)人中心'); TreeNode treeNode7 = new TreeNode('7','6','個(gè)人中心2'); TreeNode treeNode8 = new TreeNode('8','99','個(gè)人中心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))); } }

測(cè)試結(jié)果:

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

實(shí)力類不一致怎么辦? 自己寫一個(gè)實(shí)體轉(zhuǎn)換類,將類的對(duì)象屬性轉(zhuǎn)換成上面的實(shí)體類,然后在調(diào)用,當(dāng)然最快的方式直接修改實(shí)體類即可用。

以上這篇java之TreeUtils生成一切對(duì)象樹形結(jié)構(gòu)案例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产自产精品| 丝袜美腿高跟呻吟高潮一区| 亚洲高清中文字幕| 国产在线欧美日韩| 国产日韩精品一区二区三区| 成人免费视频免费观看| 91精品国产色综合久久不卡蜜臀| 久久国产精品第一页| 久久久久久久久久码影片| 亚洲一级二级三级在线免费观看| 最新日韩在线| 欧美激情一区在线| 成人丝袜视频网| 欧美一级黄色大片| 国产一区二区不卡老阿姨| 欧美艳星brazzers| 麻豆极品一区二区三区| 欧美性大战久久久久久久| 麻豆91免费观看| 欧美日韩不卡视频| 福利一区在线观看| 精品国产91亚洲一区二区三区婷婷| 岛国一区二区三区| 久久新电视剧免费观看| caoporn国产一区二区| 欧美va亚洲va| 成人av资源在线观看| 日韩三级在线观看| aaa亚洲精品一二三区| 久久一夜天堂av一区二区三区| 91最新地址在线播放| 国产精品视频麻豆| 亚洲美女网站| 夜夜精品浪潮av一区二区三区| 99精品福利视频| 一区二区三区 在线观看视频| 99亚洲视频| 亚洲第一主播视频| 久久精品国产清高在天天线| 免费人成网站在线观看欧美高清| 91久久奴性调教| 毛片不卡一区二区| 欧美一区二区三区白人| heyzo一本久久综合| 日本一区二区三区四区| 亚洲国产精品第一区二区| 亚洲国产一区二区视频| 久热精品在线| 精品在线免费观看| 欧美大片顶级少妇| 欧美激情在线| 一区二区三区资源| 欧美在线你懂的| 成人在线视频一区| 国产精品久久久久一区二区三区共 | 国产精品久久久爽爽爽麻豆色哟哟| 激情欧美国产欧美| 午夜伊人狠狠久久| 欧美高清视频www夜色资源网| 99久久精品免费看| 一级做a爱片久久| 欧美日韩一级二级三级| 99热这里都是精品| 亚洲免费av观看| 欧美专区日韩专区| 成人99免费视频| 亚洲欧美激情视频在线观看一区二区三区| 老司机精品久久| 成人亚洲精品久久久久软件| 中文字幕五月欧美| 欧美在线制服丝袜| 91亚洲国产成人精品一区二区三 | 国产清纯美女被跳蛋高潮一区二区久久w| 亚洲免费观看| 国产一区二区三区国产| 国产欧美精品一区二区色综合 | 国产精品视频一区二区三区不卡| 久久国产精品久久精品国产| 国产成人久久精品77777最新版本| 中文字幕av一区二区三区免费看 | 精品视频在线视频| 91日韩在线专区| 亚洲国产毛片aaaaa无费看| 制服丝袜av成人在线看| 国产精品啊啊啊| 久久99精品一区二区三区三区| 欧美极品少妇xxxxⅹ高跟鞋| 色域天天综合网| 91麻豆精东视频| 日韩va欧美va亚洲va久久| 久久精品一区八戒影视| 一本一道久久a久久精品综合蜜臀| 97久久超碰精品国产| 天天色综合天天| 久久精品一区二区| 欧洲精品一区二区| 1024成人| www.日韩在线| 麻豆一区二区99久久久久| 国产精品三级电影| 欧美男女性生活在线直播观看| 最新成人av网站| 99在线热播精品免费| 午夜久久久影院| 国产女人18毛片水真多成人如厕| 欧美唯美清纯偷拍| 一区二区av| 91在线观看一区二区| 蜜芽一区二区三区| 亚洲人成小说网站色在线| 欧美成人三级在线| 久久综合伊人| 亚洲精品日韩久久| av在线播放不卡| 美洲天堂一区二卡三卡四卡视频| 亚洲欧美一区二区视频| 日韩免费看的电影| 欧洲精品在线观看| 国产女主播一区二区三区| 成人18精品视频| 精品一区二区三区久久| 亚洲午夜精品在线| 国产精品成人网| 精品国产91久久久久久久妲己 | 国产成人免费视频网站| 日韩精品一二三| 亚洲女性喷水在线观看一区| 久久综合国产精品| 欧美日韩视频一区二区| 久久久久国产精品一区二区| 亚洲高清网站| 欧美午夜电影在线观看 | 免费成人美女在线观看| 亚洲欧美日韩国产综合在线| 精品久久国产97色综合| 欧美日本在线播放| 色综合久久天天| 西西裸体人体做爰大胆久久久| 午夜精品久久久久99热蜜桃导演| 国产激情视频一区二区三区欧美 | 欧美亚洲三区| 亚洲精选成人| 欧美成人dvd在线视频| 国产91高潮流白浆在线麻豆 | 日韩精品专区在线影院观看| 欧美在线影院一区二区| 久久久久久久久久久久久久一区 | 午夜精品av| 99国产精品视频免费观看| 国产美女视频一区| 看国产成人h片视频| 午夜伦理一区二区| 一区二区三区国产精华| 亚洲欧美综合另类在线卡通| 欧美国产一区二区在线观看| 久久综合av免费| 欧美va亚洲va在线观看蝴蝶网| 欧美日韩高清不卡| 欧美日韩视频在线一区二区| 欧美三级三级三级爽爽爽| 欧美性色黄大片| 在线一区二区视频| 在线免费av一区| 日本韩国一区二区三区| 一本久久综合亚洲鲁鲁五月天| 久久动漫亚洲| 老司机精品导航| 91激情在线视频| 欧美在线观看视频一区二区三区| 色综合激情久久| 日本精品裸体写真集在线观看| 在线视频欧美区| 在线这里只有精品| 欧美性大战久久久久久久| 欧美色图天堂网| 欧美日韩高清一区| 欧美疯狂性受xxxxx喷水图片| 欧美日韩国产精品成人| 在线播放欧美女士性生活| 欧美一卡在线观看| 久久亚洲综合av| 日本一区二区三区dvd视频在线| 亚洲国产成人私人影院tom| 国产精品国产成人国产三级 | 91精品福利在线| 欧美日韩成人一区| 欧美xxx久久| 欧美激情一区二区三区| 国产精品国产三级国产| 亚洲婷婷综合久久一本伊一区| 亚洲色图一区二区三区| 亚洲一区二区欧美日韩| 香蕉成人伊视频在线观看| 久久精品99国产精品| 国产很黄免费观看久久| 99视频在线精品| 亚洲成色www久久网站| 久久av一区二区| 欧美日韩午夜在线| 欧美电视剧免费观看|