你有很多對象的嵌套,所以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是相同的。 –