你有很多对象的嵌套,所以hashmap可能不是很好的数据结构。我建议推出自定义POJO和树状结构:
class Node { String canonicalPath; String type; Node parent; List<Node> children = new ArrayList<>(); }
而且修改代码:
public List<Node> displayDirectoryContents(File dir, Node parent) {
List<Node> result = new ArrayList<Node>();
try {
File[] files = dir.listFiles();
for (File file : files) {
if (file.isDirectory() && !file.getName().endsWith(".svn")) {
Node directory = new Node(file.getCanonicalPath(), "directory", parent);
directory.setChildren(displayDirectoryContents(file, directory);
result.add(directory);
} else {
result.add(new Node(file.getCanonicalPath(), "file", parent);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
类似的东西 - 而且比你的加工修改。
,或者如果你需要它的名字的文件列表:
可以引入Map<String, Object>
,并作为Object
你可以把任何String
(文件),或Map<String, Object>
的文件夹,并进行递归。
或只需制作一个List
文件,并递归填充它。纯文件路径,像
List<String> displayDirectoryContents(File dir) {
List<String> res = new ArrayList();
File[] files = dir.listFiles();
for (File file : files) {
if (file.isDirectory() && !file.getName().endsWith(".svn")) {
res.add("directory:" + file.getCanonicalPath());
res.addAll(displayDirectoryContents(file));
} else {
res.add("file:" + file.getCanonicalPath());
}
}
return res;
}
比你可以:
displayDirectoryContents("/dummypath").forEach(System.out.println);
会给你同样的结果。
或者串串
Map<String, String> res = displayDirectoryContents("/dummypath").stream().collect(Collectors.toConcurrentMap(o -> o, o -> o));
并发的地图是什么将是关键,值对吗?目前还不清楚你在问什么。 – Maroun
你的问题不清楚。如果要将某些键与某些值相关联,则使用散列映射。如果您拥有的是文件路径列表,则不具有键/值对。告诉我们你想要完成的事情(不仅仅是“把文件路径放到散列表中”)。 –
我的键和值是相同的,即上述书面代码的结果。此代码给出了存储在特定文件夹内的文件及其文件路径(我只在此处发布了部分代码)。所以无论输出什么,它都必须存储在一个hashmap中,key和values是相同的。 –