package zj.tree.util;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import zj.java.util.JavaUtil;
import zj.reflect.util.FieldUtil;
/**
* 類名 :TreeUtil<br>
* 概況 :樹工具類<br>
*
* @version 1.00 (2014.09.15)
* @author SHNKCS 張軍 {@link <a target=_blank href="http://www.dlhighland.cn">張軍個人網站</a> <a target=_blank href="http://user.qzone.qq.com/360901061/">張軍QQ空間</a>}
*/
public class TreeUtil implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 回調取機構父對象
*
* @param p_entity
* @param p_coll
*/
@SuppressWarnings("unchecked")
public static <T> void callPentity(T p_entity, List<T> p_coll, String p_pentityName){
if (p_entity == null)
return;
p_coll.add(p_entity);
Object objEntity = null;
try {
objEntity = FieldUtil.get(p_entity, p_pentityName, true);
} catch (Exception e) {
e.printStackTrace();
}
if (objEntity==null){
return;
}
callPentity((T) objEntity, p_coll, p_pentityName);
}
/**
* 取得樹路徑
*
* @param p_entity
*/
public static <T> String entityTextJoin(T p_entity, String text, String p_pentityName){
return entityTextJoin(p_entity, text, p_pentityName, "\\");
}
/**
* 取得樹路徑
*
* @param p_entity
*/
public static <T> String entityTextJoin(T p_entity, String text, String p_pentityName, String split) {
List<T> coll = new ArrayList<T>();
callPentity(p_entity, coll, p_pentityName);
StringBuffer textJoin = new StringBuffer(200);
for (int i = coll.size() - 1; i >= 0; i--) {
T entity = coll.get(i);
if (!"".equals(textJoin.toString())) {
textJoin.append(split);
}
Object objText = null;
try {
objText = FieldUtil.get(entity, text, true);
} catch (Exception e) {
e.printStackTrace();
}
textJoin.append(JavaUtil.objToStr(objText));
}
return textJoin.toString();
}
}package zj.tree.bean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import zj.reflect.util.FieldUtil;
/**
* 類名 :TreeUtil<br>
* 概況 :樹工具類<br>
*
* @version 1.00 (2014.09.15)
* @author SHNKCS 張軍 {@link <a target=_blank href="http://www.dlhighland.cn">張軍個人網站</a> <a target=_blank href="http://user.qzone.qq.com/360901061/">張軍QQ空間</a>}
*/
public class TreeNode<T> implements Serializable {
private static final long serialVersionUID = 1L;
private String idName;
private String pidName;
private boolean isPidT;
public TreeNode(String idName, String pidName) {
this(idName, pidName, false);
}
public TreeNode(String idName, String pidName, boolean isPidT) {
this.idName = idName;
this.isPidT = isPidT;
this.pidName = pidName;
}
/** 返回所有子節(jié)點的集合 **/
private List<String> rtnListId = new ArrayList<String>();
/** 返回所有子節(jié)點的集合 **/
private List<T> rtnListNode = new ArrayList<T>();
public List<String> getRtnListId() {
return rtnListId;
}
public List<T> getRtnListNode() {
return rtnListNode;
}
/**
* 根據父節(jié)點的ID獲取所有子節(jié)點
*
* @param list
* 分類表
* @param id
* 傳入的父節(jié)點ID
* @return String
*/
public void setChildNodes(List<T> list, String id) throws Exception {
setChildNodes(list, id, true);
}
/**
* 根據父節(jié)點的ID獲取所有子節(jié)點
*
* @param list
* 分類表
* @param id
* 傳入的父節(jié)點ID
* @return String
*/
public void setChildNodes(List<T> list, String id, boolean self) throws Exception {
if (list == null || list.size() == 0 || id == null || id.trim().equals(""))
return;
if (self)
for (Iterator<T> iterator = list.iterator(); iterator.hasNext();) {
T node = iterator.next();
String nodeId = getIdFieldValue(node);
if (id.equals(nodeId)) {
rtnListId.add(nodeId);
rtnListNode.add(node);
break;
}
}
for (Iterator<T> iterator = list.iterator(); iterator.hasNext();) {
T node = iterator.next();
String nodePid = getPidFieldValue(node);
// 一、根據傳入的某個父節(jié)點ID,遍歷該父節(jié)點的所有子節(jié)點
if (id.equals(nodePid)) {
recursionFn(list, node);
}
// // 二、遍歷所有的父節(jié)點下的所有子節(jié)點
// if ("".equals(node.getParentId())) {
// recursionFn(list, node);
// }
}
}
/**
* 根據父節(jié)點的ID獲取所有子節(jié)點
*
* @param list
* 分類表
* @param pid
* 傳入的父節(jié)點ID
* @return String
*/
public void setChildNodesPid(List<T> list, String pid) throws Exception {
setChildNodesPid(list, pid, true);
}
/**
* 根據父節(jié)點的ID獲取所有子節(jié)點
*
* @param list
* 分類表
* @param pid
* 傳入的父節(jié)點ID
* @param self
* 是否包含自己
* @return String
*/
public void setChildNodesPid(List<T> list, String pid, boolean self) throws Exception {
/** 返回所有子節(jié)點的集合 **/
List<String> rtnListIds = new ArrayList<String>();
/** 返回所有子節(jié)點的集合 **/
List<T> rtnListNodes = new ArrayList<T>();
if (list == null || list.size() == 0 || pid == null || pid.trim().equals(""))
return;
for (Iterator<T> iterator = list.iterator(); iterator.hasNext();) {
T node = iterator.next();
String nodePId = getPidFieldValue(node);
if ((pid == null && nodePId == null) || (pid != null && pid.equals(nodePId))) {
rtnListId.clear();
rtnListNode.clear();
String nodeId = getIdFieldValue(node);
setChildNodes(list, nodeId, self);
rtnListIds.addAll(rtnListId);
rtnListNodes.addAll(rtnListNode);
}
}
rtnListId.clear();
rtnListNode.clear();
rtnListId.addAll(rtnListIds);
rtnListNode.addAll(rtnListNodes);
}
/**
* 遞歸調用
*
* @param list
* @param node
* @throws Exception
*/
private void recursionFn(List<T> list, T node) throws Exception {
List<T> childList = getChildList(list, node);// 得到子節(jié)點列表
String nodeId = getIdFieldValue(node);
if (hasChild(list, node)) {// 判斷是否有子節(jié)點
rtnListId.add(nodeId);
rtnListNode.add(node);
Iterator<T> it = childList.iterator();
while (it.hasNext()) {
T n = it.next();
recursionFn(list, n);
}
} else {
rtnListId.add(nodeId);
rtnListNode.add(node);
}
}
// 判斷是否有子節(jié)點
public boolean hasChild(List<T> list, T node) throws Exception {
return getChildList(list, node).size() > 0 ? true : false;
}
// 得到子節(jié)點列表
public List<T> getChildList(List<T> list, T node) throws Exception {
return getChildList(list, node, false);
}
// 得到子節(jié)點列表
public List<T> getChildList(List<T> list, T node, boolean delChild) throws Exception {
List<T> nodeList = new ArrayList<T>();
List<T> newNodeList = new ArrayList<T>();
newNodeList.addAll(list);
Iterator<T> it = newNodeList.iterator();
String nodeId = getIdFieldValue(node);
while (it.hasNext()) {
T n = (T) it.next();
String nodePid = getPidFieldValue(n);
if (nodeId.equals(nodePid)) {
nodeList.add(n);
if (delChild) {
list.remove(n);
}
}
}
return nodeList;
}
// 得到子節(jié)點列表
public List<T> getChildList(List<T> list, String id) throws Exception {
return getChildList(list, id, false);
}
// 得到子節(jié)點列表
public List<T> getChildList(List<T> list, String id, boolean delChild) throws Exception {
List<T> nodeList = new ArrayList<T>();
Iterator<T> it = list.iterator();
while (it.hasNext()) {
T n = (T) it.next();
String nodeId = getIdFieldValue(n);
if (nodeId.equals(id)) {
return getChildList(list, n, delChild);
}
}
return nodeList;
}
/**
* 轉對象為字符串
*
* @param o
* @return
*/
private String objToStr(Object o) {
return o == null ? "" : String.valueOf(o);
}
/**
* 獲取屬性值ID
*
* @param t
* @param fieldName
* @return
* @throws Exception
*/
private String getIdFieldValue(T t) throws Exception {
return objToStr(FieldUtil.get(t, this.idName, true));
}
/**
* 獲取屬性值PID
*
* @param t
* @param fieldName
* @return
* @throws Exception
*/
private String getPidFieldValue(T t) throws Exception {
Object o = FieldUtil.get(t, this.pidName, true);
if (this.isPidT) {
if (o == null)
return "";
return objToStr(FieldUtil.get(o, this.idName, true));
} else {
return objToStr(o);
}
}
}
本文為張軍原創(chuàng)文章,轉載無需和我聯系,但請注明來自張軍的軍軍小站,個人博客http://www.dlhighland.cn
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

