package com.doumee.dao.business.vo; import com.doumee.config.DataSyncConfig; import com.doumee.dao.business.model.Shop; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; import java.util.List; import java.util.Objects; /** * Created by IntelliJ IDEA. * * @Author : Rk * @create 2023/7/13 10:40 */ public class ShopTree { // 保存参与构建树形的所有数据(通常数据库查询结果) public List nodeList = new ArrayList<>(); public List dealedList = new ArrayList<>(); public int dealIndex =0; /** * 构造方法 * @param nodeList 将数据集合赋值给nodeList,即所有数据作为所有节点。 */ public ShopTree(List nodeList ){ this.nodeList = nodeList; this.dealedList = new ArrayList<>(); } /** * 获取需构建的所有根节点(顶级节点) "0" * @return 所有根节点List集合 */ public List getRootNode(){ // 保存所有根节点(所有根节点的数据) List rootNodeList = new ArrayList<>(); // treeNode:查询出的每一条数据(节点) for (ShopTreeVo treeNode : nodeList){ if (isParentNode(treeNode) ) { // 是,添加 rootNodeList.add(treeNode); } } return rootNodeList; } private boolean isParentNode(ShopTreeVo treeNode) { if(StringUtils.isBlank(treeNode.getParentIamId())){ return true; } /* for (Shop s : nodeList){ if ( StringUtils.equals(treeNode.getParentIamId(),s.getOrgId())) { // 是,添加 return false; } }*/ return false; } /** * 根据每一个顶级节点(根节点)进行构建树形结构 * @return 构建整棵树 */ public List buildTree(){ List treeNodes = new ArrayList<>(); // getRootNode():获取所有的根节点 for (ShopTreeVo treeRootNode : getRootNode()) { // 将顶级节点进行构建子树 treeRootNode = buildChildTree(treeRootNode); // 完成一个顶级节点所构建的树形,增加进来 treeNodes.add(treeRootNode); } return treeNodes; } private boolean isDealedNode(ShopTreeVo treeRootNode) { for (ShopTreeVo s : this.dealedList) { // 将顶级节点进行构建子树 if(StringUtils.equals(s.getOrgId(),treeRootNode.getOrgId())){ return true; } } return false; } /** * 递归-----构建子树形结构 * @param pNode 根节点(顶级节点) * @return 整棵树 */ public ShopTreeVo buildChildTree(ShopTreeVo pNode){ if(isDealedNode(pNode)){ System.out.println(pNode.getId()+"==已处理=="+pNode.getName()); return pNode; } // 再递归进行判断当前节点的情况,调用自身方法 this.dealedList.add(pNode); List childTree = new ArrayList<>(); // nodeList:所有节点集合(所有数据) for (ShopTreeVo treeNode : nodeList) { // 判断当前节点的父节点ID是否等于根节点的ID,即当前节点为其下的子节点 if (StringUtils.isNotBlank(treeNode.getParentIamId())&&StringUtils.equals(treeNode.getParentIamId(),pNode.getOrgId())) { childTree.add(buildChildTree(treeNode)); } } // for循环结束,即节点下没有任何节点,树形构建结束,设置树结果 pNode.setChildList(childTree); if(childTree.size()>0){ System.out.println(pNode.getId()+"==有下级=="+(dealIndex++)+pNode.getName()); }else{ System.out.println(pNode.getId()+"==无下级=="+(dealIndex++)+pNode.getName()); } return pNode; } }