gpt4 book ai didi

java - 如何从文件夹对象列表中递归获取绝对路径?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:03:51 31 4
gpt4 key购买 nike

有文件夹对象列表,我需要将它们连接到绝对路径。每个文件夹都有字段“parentId”(可空)和“orderNumber”,如:

class Folder {
folderId;
desc;
parentId;
orderNumber;
}

因此,如果 parentId == null -> 文件夹是绝对路径中的第一个,如果不是 -> 我们应该获取父文件夹等等。

我是这样弄的,有没有更简单的方法?

public static void main(String[] args) {
List<Folder> list = new ArrayList<Folder>();
list.add(new Folder(1, null, "root1"));
list.add(new Folder(3, 2, "child2"));
list.add(new Folder(2, 1, "child1"));
list.add(new Folder(5, 4, "child4"));
list.add(new Folder(6, null, "root2"));
list.add(new Folder(4, 3, "child3"));

Integer fromId = 5;
String path = getAbsolutePath(list, getFolderById(list, fromId));
System.out.println(path);
}

public static String getAbsolutePath(List<Folder> list, Folder folder) {
String path = "";
Integer parentId = folder.getParentId();
if (parentId != null) {
Folder parent = getFolderById(list, parentId);
path += getAbsolutePath(list, parent) + "/";
}
path += folder.getDesc();
return path;
}

public static Folder getFolderById(List<Folder> list, Integer folderId) {
return list.stream().filter(row -> row.getId() == folderId).findFirst().get();
}

Output: root1/child1/child2/child3/child4

更新:

public static void main(String[] args) {
List<Folder> list = new ArrayList<Folder>();
list.add(new Folder(1, null, "root1"));
list.add(new Folder(3, 2, "child2"));
list.add(new Folder(2, 1, "child1"));
list.add(new Folder(5, 4, "child4"));
list.add(new Folder(6, null, "root2"));
list.add(new Folder(4, 3, "child3"));
Map<Integer, Folder> folderMap = list.stream().collect(Collectors.toMap(
Folder::getId, folder -> folder
));

Integer fromId = 5;
String path = getAbsolutePath(folderMap, folderMap.get(fromId));
System.out.println(path);
}

public static String getAbsolutePath(Map<Integer, Folder> folderMap, Folder folder) {
Folder current = folder;
List<String> buffer = new ArrayList<>();
while(true) {
Integer parentId = current.getParentId();
buffer.add(current.getDesc());
if (parentId != null) {
current = folderMap.get(parentId);
} else {
break;
}
}
Collections.reverse(buffer);
return String.join("/", buffer);
}

最佳答案

首先,您的代码看起来不错。它编译,它解决了问题,它可能不会成为性能瓶颈(除非有很多文件夹)。但是,寻找改进方法对您有好处。顺便说一句,有一个堆栈交换站点 - codereview.stackexchange.com .

为了稍微提高效率,我对文件夹进行了预处理,这样我就不必每次都遍历整个列表来通过其 ID 找到父文件夹。只需将文件夹放在 Map<Integer, Folder> 中(使用 ID 作为键)因此可以通过 ID 轻松快速地找到父文件夹。

为了提高可读性,我还将递归替换为一个简单的循环。它会更美观、更易于调试,甚至可能更高效。

关于java - 如何从文件夹对象列表中递归获取绝对路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58312302/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com