java 树形结构转层级结构

直接上代码

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);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值