阿里云OSS 文件List 转换为树形结果

阿里云的oss 可以返回一个文件List 但是文件List 有时候需要转换为树形结果

实现算法的思路是递归。

直接看代码:



import java.io.File;
import java.util.*;
import java.util.stream.Collectors;

public class OssTreeList {


    static Folder buildFolder(String name) {

        Folder folder = new Folder();
        folder.setName(name);
        folder.setChildren(new ArrayList<>());
        folder.setPermission(Permission.of(1, Collections.emptyList()));
        return folder;
    }

    /*  static List<ListDown*/

    /**
     * 生成一个Tree 型结构List
     *
     * @param folderObjects
     * @return
     */
    static List<Folder> formatFoldersTree(OSSObjectImportContext importCtx, List<HttpClientUtils.OSSObject> folderObjects) {
        List<Folder> folders = new ArrayList<>();
        List<List<String>> namesList = new ArrayList<>(50);
        for (HttpClientUtils.OSSObject object : folderObjects) {
            List<String> names = Arrays.asList(object.getName().split(File.separator));
            System.out.println(object.getName());
            namesList.add(names);
        }
        Folder topFolder = buildFolder(importCtx.getItemNum());
        LinkedHashMap<String, List<List<String>>> brandMap = namesList.stream().collect(Collectors.groupingBy(a -> a.get(0), LinkedHashMap::new, Collectors.toList()));
        List<List<String>> subFolders = brandMap.get(topFolder.getName()).stream().filter(a -> a.size() > 1).collect(Collectors.toList());
        System.out.println(brandMap);
        if (subFolders.size() > 0) {
            folders.add(link(topFolder, subFolders));
        } else {
            folders.add(topFolder);
        }

        return folders;
    }

    static Folder link(Folder folder, List<List<String>> sublists) {

        List<Folder> folders = new ArrayList<>();
        List<List<String>> subliststemp = new ArrayList<>();
        for (List<String> subList : sublists) {
            subList = subList.subList(1, subList.size());
            subliststemp.add(subList);
        }
        LinkedHashMap<String, List<List<String>>> brandMap = subliststemp.stream().collect(Collectors.groupingBy(a -> a.get(0), LinkedHashMap::new, Collectors.toList()));
        System.out.println(brandMap);

        for (String folderName : brandMap.keySet()) {
            System.out.println("新建父层级文件夹: " + folderName);
            Folder current = buildFolder(folderName);
            List<List<String>> subFolders = brandMap.get(folderName).stream().filter(a -> a.size() > 1).collect(Collectors.toList());
            System.out.println(brandMap);
            if (subFolders.size() > 0) {
                link(current, subFolders);
            }
            folders.add(current);
        }

        folder.setChildren(folders);
        return folder;

    }


    public static void main(String[] args) {

        HttpClientUtils.OSSObject f1 = new HttpClientUtils.OSSObject("1028/设计/设计师文件/sku/");
        HttpClientUtils.OSSObject f2 = new HttpClientUtils.OSSObject("1028/设计/N1/sku/");
        HttpClientUtils.OSSObject f3 = new HttpClientUtils.OSSObject("1028/设计/N2/sku/");
        HttpClientUtils.OSSObject f4 = new HttpClientUtils.OSSObject("1028/3D/N1/sku1/");
        HttpClientUtils.OSSObject f5 = new HttpClientUtils.OSSObject("1028/3D/设计师文件/sku/");
        HttpClientUtils.OSSObject f6 = new HttpClientUtils.OSSObject("1028/3D/N1/sku1/pp");
        HttpClientUtils.OSSObject f7 = new HttpClientUtils.OSSObject("1028/3D/设计师文件/sku3/");
        HttpClientUtils.OSSObject f8 = new HttpClientUtils.OSSObject("1028/素材/N1/sku2/op");
        HttpClientUtils.OSSObject f9 = new HttpClientUtils.OSSObject("1028/3D/设计师文件2/sku/2/5");
        HttpClientUtils.OSSObject f10 = new HttpClientUtils.OSSObject("1028/3D/设计师文件6/sku2/3/5");
        HttpClientUtils.OSSObject f11 = new HttpClientUtils.OSSObject("1028/");
        HttpClientUtils.OSSObject[] temp = {f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11};
        List<HttpClientUtils.OSSObject> folderObjects = Arrays.asList(temp);
        OSSObjectImportContext importCtx = new OSSObjectImportContext();
        importCtx.setItemNum("1028");
        formatFoldersTree(importCtx, folderObjects);

        /*HttpClientUtils.OSSObject f2 = new HttpClientUtils.OSSObject("1028/设计/N1/sku/");
        HttpClientUtils.OSSObject[] temp = {f2};
        List<HttpClientUtils.OSSObject> folderObjects = Arrays.asList(temp);
        OSSObjectImportContext importCtx = new OSSObjectImportContext();
        importCtx.setItemNum("1028");
        formatFoldersTree(importCtx, folderObjects);*/


    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值