封装树形数据结构

此方法使用于通过id,pid关联的树形对象.多用于无深度确定的树形结构


1.创建树形结构对象

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

 */
public class Tree<T>{
   
   //节点ID,这个节点的唯一标识,通常情况下使用主键或者列的唯一标识都可以。
   //这里使用String类型是为了兼容所有的标识,可以是数字类型的字符形式
   private String id;
   
   //节点的父节点
   private String parentId;
   
   //这个节点显示的文本
   private String text;
   
   //是否有父节点
   private Boolean haveParent = false;
   
   //是否有子节点
   private Boolean haveChildrens = false;
   
   //节点子节点
   private List<Tree<T>> children = new ArrayList<Tree<T>>();
      
   //节点的额外属性,比如把展开属性和选中属性设置在这里
   private Map<String,Object> attributes;

   public String getId() {
      return id;
   }

   public void setId(String id) {
      this.id = id;
   }

   public String getParentId() {
      return parentId;
   }


   public void setParentId(String parentId) {
      this.parentId = parentId;
   }


   public String getText() {
      return text;
   }


   public void setText(String text) {
      this.text = text;
   }

   public List<Tree<T>> getChildren() {
      return children;
   }

   public void setChildren(List<Tree<T>> children) {
      this.children = children;
   }

   public Map<String, Object> getAttributes() {
      return attributes;
   }

   public void setAttributes(Map<String, Object> attributes) {
      this.attributes = attributes;
   }


   public Boolean getHaveParent() {
      return haveParent;
   }


   public void setHaveParent(Boolean haveParent) {
      this.haveParent = haveParent;
   }

   public Boolean getHaveChildrens() {
      return haveChildrens;
   }


   public void setHaveChildrens(Boolean haveChildrens) {
      this.haveChildrens = haveChildrens;
   }
   
}

2.工具类,将集合转为树形结构

 
import java.util.ArrayList;
import java.util.List;

import com.test.Tree;


public class TreeUtil {

   public static <T> Tree<T> buildToTree(List<Tree<T>> nodes,String rootNodeName) {

      //如果节点的Listnull,就返回null
      if (nodes == null) {
         return null;
      }
      //没有父节点节点列表
      List<Tree<T>> topNodes = new ArrayList<Tree<T>>();

      
      for (Tree<T> children : nodes) {
         
         //遍历所有的节点,找出所有的顶级节点,将没有父节点的节点存起来
         String pid = children.getParentId();
         if (pid == null || "".equals(pid)) {
            topNodes.add(children);
            //只要没有父节点,添加后就跳过
            continue;
         }
   
         //那么剩下的节点都是有父节点,我们给这个孩子节点找父亲节点
         for (Tree<T> parent : nodes) {
            String id = parent.getId();
            
            if (id != null && id.equals(pid)) {
               parent.getChildren().add(children);
               children.setHaveParent(true);
               parent.setHaveChildrens(true);
               //如果找到父节点并将子节点设置到这个父节点上就可以停止继续循环查找
               break;
            }
         }

      }

      //把根节点返回,如果没有父节点不只一个,我们给这些节点创建一个根节点
      Tree<T> root = new Tree<T>();
      if (topNodes.size() == 1) {
         root = topNodes.get(0);
      } else {
         root.setId("-1");
         root.setParentId("");
         root.setHaveParent(false);
         root.setHaveChildrens(true);
         root.setAttributes(null);
         root.setChildren(topNodes);
         root.setText(rootNodeName);

      }

      return root;
   }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值