一 在系统管理的时候,做菜单用到了树形工具类,封装了一下,以后备用。
直接上代码:
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;
}
}