直接上代码
import com.alibaba.fastjson.JSONObject;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
public class TreeTransferUtil {
/**
* 显示在一个层级的树形数据转成多层级的树形结构,子节点放在指定参数中
* @param originalList 数据集合
* @param idFieldName 子节点参数名
* @param pidFieldName 父节点参数名
* @param childrenName 子节点集合参数名
* @return
*/
public static List<JSONObject> toJsonTreeList(List<JSONObject> originalList, String idFieldName, String pidFieldName, String childrenName){
if (originalList == null || StringUtils.isEmpty(idFieldName) || StringUtils.isEmpty(pidFieldName) || StringUtils.isEmpty(childrenName)){
return null;
}
// 元素不超过1个,直接返回
if (originalList.size() <= 1){
return originalList;
}
// 查找list中的顶级节点
List<JSONObject> rootNodes = new ArrayList<>();
for (JSONObject node : originalList){
// 检查每个节点是否存在父节点
boolean pFlag = true;
for (JSONObject pNode : originalList){
if (pNode.getString(idFieldName).equals(node.getString(pidFieldName))){
pFlag = false;
break;
}
}
if (pFlag && !rootNodes.contains(node)){
rootNodes.add(node);
}
}
// list去除根节点
originalList.removeAll(rootNodes);
if (originalList.size() > 0){
// 递归,增加children节点
setJsonChildren(rootNodes, originalList, idFieldName, pidFieldName, childrenName);
}
return rootNodes;
}
/**
* 显示在一个层级的树形数据转成多层级的树形结构
* 子节点参数为id、父节点参数为pid、子节点集合参数为children
* @param originalList
* @return
*/
public static List<JSONObject> toCommonJsonTreeList(List<JSONObject> originalList){
return toJsonTreeList(originalList, "id", "pid", "children");
}
private static void setJsonChildren(List<JSONObject> rootNodes, List<JSONObject> originalList, String idFieldName, String pidFieldName, String
childrenName) {
for (JSONObject root : rootNodes){
List<JSONObject> children = new ArrayList<>();
// 设置子节点
for (JSONObject child : originalList){
if (child.getString(pidFieldName).equals(root.getString(idFieldName))){
if (!children.contains(child)){
children.add(child);
}
}
}
// 如果没有子节点了,结束递归
if (children == null || children.size() <= 0){
continue;
}
root.put(childrenName, children);
// 移除本次节点
originalList.removeAll(children);
// 继续递归
setJsonChildren(children, originalList, idFieldName, pidFieldName, childrenName);
}
}
}