转载:https://www.oschina.net/code/snippet_128691_18842
import java.io.Serializable;
import java.util.ArrayList; import java.util.List;/** * * 描述:基层树形结构实体类--ID AND PARENTID AND CHILDSLIST * 作者: xfz * 时间:2016年7月2日 * 版本号:1.0 */ 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; } }
import java.io.Serializable; import java.util.List;
/** * * 描述:树形结构服务类 * 作者: xfz * 时间:2016年7月2日 * 版本号:1.0 */ public interface TreeInterface<T extends BaseTreeObj<T,ID>, ID extends Serializable>{ /** * 获得指定节点下所有归档 * @param list * @param parentId * @return * @author xfz * 上午1:09:49 */ public List<T> getChildTreeObjects(List<T> list,ID parentId); /** * 递归列表 * @param list * @param t * @author xfz * 上午1:11:57 */ public void recursionFn(List<T> list,T t); /** * 获得指定节点下的所有子节点 * @param list * @param t * @return * @author xfz * 上午1:12:55 */ public List<T> getChildList(List<T> list,T t); /** * 判断是否还有下一个子节点 * @param list * @param t * @return * @author xfz * 上午1:13:43 */ public boolean hasChild(List<T> list, T t); }
import java.io.Serializable; import java.util.ArrayList; import java.util.Iterator; import java.util.List;
/** * * 描述:获得树形的服务实现 作者: xfz
*时间:2016年7月2日
*版本号:1.0 */ public abstract class TreeService<T extends BaseTreeObj<T,ID> , ID extends Serializable> implements TreeInterface<T, ID> {
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; }
/** * 递归列表 * * @param list * @param t * @author xfz
*上午1:11:57 */ public void recursionFn(List<T> list, T t) { List<T> childsList=getChildList(list, t); /** * 设置他的子集对象集 */ t.setChildsList(childsList); /** * 迭代--这些子集的对象--时候还有下一级的子级对象 */ for (T nextChild : childsList) { /** * 下一个对象,与所有的资源集进行判断 */ if(hasChild(list, nextChild)){ /** * 有下一个子节点,递归 */ Iterator<T> it = childsList.iterator(); while (it.hasNext()) { T node = it.next(); /** * 所有的对象--跟当前这个childsList 的对象子节点 */ recursionFn(list, node); } } } }
/** * 获得指定节点下的所有子节点 * * @param list * @param t * @return * @author xfz
*上午1:12:55 */ public List<T> getChildList(List<T> list, T t) { List<T> childsList=new ArrayList<T>(); Iterator<T> it=list.iterator(); while(it.hasNext()){ T child=it.next(); /** * 判断集合的父ID是否等于上一级的id */ if(((BaseTreeObj<T,ID>)child).getParentId()==((BaseTreeObj<T,ID>)t).getId()){ childsList.add(child); } } return childsList; }
/** * 判断是否还有下一个子节点 * * @param list * @param t * @return * @author xfz
*上午1:13:43
*/ public boolean hasChild(List<T> list, T t) { return getChildList(list, t).size() > 0 ? true : false; } }