前言说明
在描述目录或者其他情况时会使用到树状结构,
正文,java代码
在类中使用无限嵌套实例对象来构造树状结构。
import lombok.Data;
@Data
public class FSStructure {
private String nameKey;
private String parentdir;
@Data
public static class Jiqun {
private int level;
// 记录一个当前的目录
private String currentdir = "";
private Set<Jiqun> jiquns = new HashSet<>();
private Set<String> files = new HashSet<>();
// 全部比较的目录都不加反斜杠 /
void add(String[] split, List<String> files, Jiqun current, int level) {
System.out.println(split.length);
System.out.println(JSON.toJSONString(split));
if (Objects.equals(split[0], "")) {
current.files.addAll(files);
return;
}
// 有相同的 截断 就继续找 ,没有的话 去创建追加.
Set<String> nextdir = current.jiquns.stream().map(jiqun -> jiqun.currentdir).collect(Collectors.toSet());
if (!nextdir.contains(split[0])) {
Jiqun temp = current;
int temlevel = level;
for (String s : split) {
System.out.println("===in===" + s);
temlevel++;
Jiqun temp2 = new Jiqun();
temp2.currentdir = s;
temp2.level = temlevel;
temp.jiquns.add(temp2);
temp = temp2;
}
temp.files.addAll(files);
} else {
String[] nextstr = split.length == 1 ? new String[]{""} : Arrays.copyOfRange(split, 1, split.length);
for (Jiqun jiqun : current.jiquns) {
if (Objects.equals(jiqun.currentdir, split[0])) {
add(nextstr, files, jiqun, level + 1);
}
}
// 循环,找到相同层目录的下一层。=第一个不相同层
}
}
}
类变量可以根据需要修改。其中 List <Jiqun> 是记录树状结构的核心。
递归调用:
1,判断如果目录只有一层,就立即创建,
2-1,如果目录结构有多层,先对比当前层的目录名称是否包含在瑶插入的目录路径中,一层层判断,直到遇上无重叠的那一层,然后再创建新的内部对象。
level是记录当前层数的,可以不用。
调用:
public Jiqun gerante(Map<String, List<String>> map) {
Jiqun jiqun = new Jiqun();
map.forEach((s, strings) -> jiqun.add(s.split("/"), strings, jiqun,0));
return jiqun;
}
这里的 map结构很简单 key=完整目录路径, value = 文件对象的唯一id。(因为我这里接入的是对象存储。)
结果使用json2 打印出来:
{
"currentdir": "",
"files": [
"3233.jpg",
],
"jiquns": [
{
"currentdir": "pdf",
"files": [
"pdf/xxx/xxx.pdf",
…………………………
],
"jiquns": [
{
"currentdir": "xxx",
"files": [
…………………………
],
"jiquns": [],
"level": 2
}
],
"level": 1
}
],
"level": 0
}
名字改成合适的就可以用了。