/*** 树形表格工具类
*
*@authoryanggb*/
public classTreeTableUtil {/*** 把列表转换为树结构
*
*@paramoriginalList 原始list数据
*@paramidFieldName 作为唯一标示的字段名称
*@parampidFieldName 父节点标识字段名
*@paramchildrenFieldName 子节点(列表)标识字段名
*@return树结构列表*/
public static List list2TreeList(ListoriginalList, String idFieldName, String pidFieldName,
String childrenFieldName) {//获取根节点,即找出父节点为空的对象
List rootNodeList = new ArrayList<>();for(T t : originalList) {
String parentId= null;try{
parentId=BeanUtils.getProperty(t, pidFieldName);
}catch (IllegalAccessException | InvocationTargetException |NoSuchMethodException e) {
e.printStackTrace();
}if(StringUtils.isBlank(parentId)) {
rootNodeList.add(0, t);
}
}//将根节点从原始list移除,减少下次处理数据
originalList.removeAll(rootNodeList);//递归封装树
try{
packTree(rootNodeList, originalList, idFieldName, pidFieldName, childrenFieldName);
}catch(Exception e) {
e.printStackTrace();
}returnrootNodeList;
}/*** 封装树(向下递归)
*
*@paramparentNodeList 要封装为树的父节点对象集合
*@paramoriginalList 原始list数据
*@paramkeyName 作为唯一标示的字段名称
*@parampidFieldName 父节点标识字段名
*@paramchildrenFieldName 子节点(列表)标识字段名*/
private static void packTree(List parentNodeList, ListoriginalList, String keyName,
String pidFieldName, String childrenFieldName)throwsException {for(T parentNode : parentNodeList) {//找到当前父节点的子节点列表
List children =packChildren(parentNode, originalList, keyName, pidFieldName, childrenFieldName);if(children.isEmpty()) {continue;
}//将当前父节点的子节点从原始list移除,减少下次处理数据
originalList.removeAll(children);//开始下次递归
packTree(children, originalList, keyName, pidFieldName, childrenFieldName);
}
}/*** 封装子对象
*
*@paramparentNode 父节点对象
*@paramoriginalList 原始list数据
*@paramkeyName 作为唯一标示的字段名称
*@parampidFieldName 父节点标识字段名
*@paramchildrenFieldName 子节点(列表)标识字段名*/
private static List packChildren(T parentNode, ListoriginalList, String keyName, String pidFieldName,
String childrenFieldName)throwsException {//找到当前父节点下的子节点列表
List childNodeList = new ArrayList<>();
String parentId=BeanUtils.getProperty(parentNode, keyName);for(T t : originalList) {
String childNodeParentId=BeanUtils.getProperty(t, pidFieldName);if(parentId.equals(childNodeParentId)) {
childNodeList.add(t);
}
}//将当前父节点下的子节点列表写入到当前父节点下(给子节点列表字段赋值)
if (!childNodeList.isEmpty()) {
FieldUtils.writeDeclaredField(parentNode, childrenFieldName, childNodeList,true);
}returnchildNodeList;
}
}