好久就想寫博客了,苦苦因為沒時間...沒關系。從現在開始,每天我都會努力抽出點時間來進行做一次總結。把我認為在項目需求中認為很有用的東西,展示給大家,希望大家一起學習,一起進步。第一次做總結,寫的不好的,提出來一起學習,謝謝。
分析: 在業務需求總,我們總會碰到一些業務。比如:對上下級的用戶關系進行遍歷,對資源權限進行遍歷...等等。這些業務非常常見。在同一個項目中,他的代碼遍歷都是類似的,為了更高效的復用代碼,我們有必要進行深成次的封轉。下面是我花了一點時間進行封裝,有需要直接拿去用,轉載請說明出處。
本代碼主要是為了節省對於上下級關系的實體類進行遍歷,進行通用性封裝。不多說:上代碼。
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;
}
}