阿里云的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);*/
}
}