List 转树形结构

基本结构

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ListTreeImpl {

    //编号
    private Integer idx;

    //当前主键
    private String id;

    //上级主键
    private String pid;

    //子集集合
    private List<ListTreeImpl> children;
}

使用递归方式,获取根节点

    //获取树的根节点
    public static List<ListTreeImpl> getTreeRoot(ArrayList<ListTreeImpl> list) {
        ArrayList<ListTreeImpl> trees = new ArrayList<>();
        // 获取树的根节点
        for (ListTreeImpl tree : list) {
            String p = tree.getPid();
            boolean flag = false;
            for (ListTreeImpl tree1 : list) {
                // 循环判断当前是否在这个集合中有父节点
                if (tree1.getId() == null && p == null || tree1.getId().equals(p)) {
                    flag = true;
                    break;
                }
            }
            if (!flag) {
                trees.add(tree);
            }
        }
        return trees;
    }

递归实现树

    //递归判断实现树结构
    public static void getTreesByRecursive(List<ListTreeImpl> trees, ArrayList<ListTreeImpl> list) {
        for (ListTreeImpl tree : trees) {
            String id = tree.getId();
            String pid = tree.getPid();
            List<ListTreeImpl> listTreeImpls = new ArrayList<>();
            for (ListTreeImpl listTreeImpl : list) {
                String pid1 = listTreeImpl.getPid();
                String id1 = listTreeImpl.getId();
                if (pid1 == null && pid == null || pid1 != null && pid1.equals(id)) {
                    if (!(id == null && id1 == null || id.equals(id1))) {
                        listTreeImpls.add(listTreeImpl);
                    }
                }
            }
            tree.setChildren(listTreeImpls);
            getTreesByRecursive(tree.getChildren(), list);
        }
    }

不使用递归方式1-获取每一个分层

    //获得分层的树(同一层的放一起)
    public static ArrayList<List<ListTreeImpl>> stratifying(ArrayList<ListTreeImpl> list) {
        ArrayList<List<ListTreeImpl>> arrayList = new ArrayList();
        if (list != null && list.size() > 0) {
            while (list.size() > 0) {
                List<ListTreeImpl> listTreeImpls = new ArrayList<>();
                for (int i = 0; i < list.size(); i++) {
                    boolean flag = true;
                    for (int i1 = 0; i1 < list.size(); i1++) {
                        ListTreeImpl externalTree = list.get(i);
                        ListTreeImpl innerTree = list.get(i1);
                        String externalTreePid = externalTree.getPid();
                        String innerTreePid = innerTree.getPid();
                        String innerTreeId = innerTree.getId();
                        if (!(externalTreePid == null && innerTreePid == null || externalTreePid != null && externalTreePid.equals(innerTreePid))) {
                            if (externalTreePid != null && externalTreePid.equals(innerTreeId)) {
                                flag = false;
                                break;
                            }
                        }
                    }
                    if (flag) {
                        listTreeImpls.add(list.get(i));
                    }
                }
                arrayList.add(listTreeImpls);
                list.removeAll(listTreeImpls);
            }
        }
        return arrayList;
    }

将分层结构弄成树

    //将分层的list的下级放入本级的children中
    public static List<ListTreeImpl> getTreeNo
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值