阿里云的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 formatFoldersTree(OSSObjectimportContext importCtx, List folderObjects) {
List folders = new ArrayList<>();
List> namesList = new ArrayList<>(50);
for (HttpClientUtils.OSSObject object : folderObjects) {
List names = Arrays.asList(object.getName().split(File.separator));
System.out.println(object.getName());
namesList.add(names);
}
Folder topFolder = buildFolder(importCtx.getItemNum());
linkedHashMap>> brandMap = namesList.stream().collect(Collectors.groupingBy(a -> a.get(0), linkedHashMap::new, Collectors.toList()));
List> 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> sublists) {
List folders = new ArrayList<>();
List> subliststemp = new ArrayList<>();
for (List subList : sublists) {
subList = subList.subList(1, subList.size());
subliststemp.add(subList);
}
linkedHashMap>> 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> 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 folderObjects = Arrays.asList(temp);
OSSObjectimportContext importCtx = new OSSObjectimportContext();
importCtx.setItemNum("1028");
formatFoldersTree(importCtx, folderObjects);
}
}



