树形结构工具类

一  在系统管理的时候,做菜单用到了树形工具类,封装了一下,以后备用。

直接上代码:

package com.xuhao.callBack;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;


/**
 * 基层树形结构实体类
 * @author XuHao
 *
 */
public class BaseTreeObj<E, ID extends Serializable> implements Serializable {
	private static final long serialVersionUID = 1L;
	private ID id;  
	private ID parentId;   
	private List<E> childsList = new ArrayList<E>();
	public ID getId() {
		return id;
	}
	public void setId(ID id) {
		this.id = id;
	}
	public ID getParentId() {
		return parentId;
	}
	public void setParentId(ID parentId) {
		this.parentId = parentId;
	}
	public List<E> getChildsList() {
		return childsList;
	}
	public void setChildsList(List<E> childsList) {
		this.childsList = childsList;
	}  
	
	
	
}


package com.xuhao.callBack;

import java.io.Serializable;
import java.util.List;


/**
 * 树形结构服务类
 * @author XuHao
 *
 */
public interface TreeInterface<T extends BaseTreeObj<T, ID>, ID extends Serializable> {
	/**
	 * 获得指定节点下的所有归档
	 * @param list
	 * @param parentId
	 * @return
	 */
	public List<T> getChildTreeObjects(List<T> list, ID parentId);
	
	
	/**
	 * 递归列表
	 * @param list
	 * @param t
	 */
	public void recursionFn(List<T> list, T t);
	
	/**
	 * 获得指定节点下的所有子节点
	 * @param list
	 * @param t
	 * @return
	 */
	public List<T> getChildList(List<T> list, T t);
	
	/**
	 * 判断是否还有下一个子节点
	 * @param list
	 * @param t
	 * @return
	 */
	public boolean hasChild(List<T> list, T t);
	
}



package com.xuhao.callBack;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


/**
 * 树形工具类
 * @author XuHao
 *
 */
public class TreeUtil<T extends BaseTreeObj<T, ID>, ID extends Serializable> 
   implements TreeInterface<T, ID>{

	
	/**
	 * 获得指定节点下的所有归档     eg: List<Resource>资源List  
	 */
	@Override
	public List<T> getChildTreeObjects(List<T> list, ID parentId) {
		List<T> returnList = new ArrayList<T>();
		for(Iterator<T> iterator = list.iterator(); iterator.hasNext();){
			T res = (T)iterator.next();
			//  判断第一个对象是否为第一个节点
			if(res.getParentId() == parentId){
				// 说明第一个节点为父节点---递归下面的子节点
				recursionFn(list, res);
				returnList.add(res);
			}
		}
		return returnList;
	}

	/**
	 * 递归列表
	 */
	@Override
	public void recursionFn(List<T> list, T t) {
		//  获取子集
		List<T> childList = getChildList(list, t);
		// 设置他的子集对象集
		t.setChildsList(childList);
		//  迭代这些子集的对象 是否还有下一级的子集对象
		for(T nextChild : childList){
			//  下一个对象 与所有的资源集进行判断
			if(hasChild(list, nextChild)){
				//  有下一个子节点 递归
				Iterator<T> it = childList.iterator();
				while(it.hasNext()){
					T node = it.next();
					//  递归   childList的对象子节点
					recursionFn(list, node);
				}
			}
		}
		
	}

	/**
	 * 获得指定节点下的所有子节点
	 */
	@Override
	public List<T> getChildList(List<T> list, T t) {
		List<T> childList = new ArrayList<T>();
		Iterator<T> iterator = list.iterator();
		while(iterator.hasNext()){
			T child = iterator.next();
			//  判断集合的父ID是否是上一级的ID
			if(((BaseTreeObj<T, ID>)child).getParentId() == ((BaseTreeObj<T, ID>)t).getId()){
				childList.add(child);
			}
		}
		return childList;
	}

	/**
	 * 判断是否还有下一个子节点
	 */
	@Override
	public boolean hasChild(List<T> list, T t) {
		return getChildList(list, t).size() > 0 ? true : false;
	}
	
	
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值