我使用以下代码遍历目录并将文件添加到mutable Map
mutable ListBuffer
。关键是目录名称,值是该目录下的文件列表。
def WalkDir(path:String): scala.collection.mutable.HashMap[String,scala.collection.mutable.ListBuffer[String]] = {
def collectFiles(p:Path, allFiles: scala.collection.mutable.HashMap[String,scala.collection.mutable.ListBuffer[String]]): = {
val fileIterator = ... //List all the files
while (fileIterator.hasNext()) {
val f = fileIterator.next()
if (f is not directory) { // pseduo code
val dir = f.getDir() // pseudo code
if (! allFiles.contains(f.getDir().toString())
{
val files = new scala.collection.mutable.ListBuffer[String]
files += (f.path().toString()) // psudeo-code file path
allFiles.put(dir.toString(), files)
}
else {
val t_list = allFiles.get(dir.toString()
allFiles.put(dir.toString(), t_list += f.path().toString())
}
}
if (f is directory) collectFiles(f.getPath(), allFiles)
}
collectFiles(path, new scala.collection.mutable.HashMap[String, scala.collection.mutable.ListBuffer[String]])
}
如何将返回值转换为Map[String, List[String]]
?是否有更“实用”的方法来实现相同的结果?
答案 0 :(得分:0)
java.nio.file
软件包同时包含SimpleFileVisitor
和Files
,这样可以轻松实现这一目标。子类SimpleFileVisitor
,覆盖preVisitDirectory
和visitFile
;然后用Files.walkFileTree
驱动它。
但是对你的问题更一般的回答是这是一个 fold 操作,所以使用你现有的代码看起来像是:
filesIterator.foldLeft(Map.empty[String, Seq[String]]) { case (map, file) =>
...
// return an updated map
map + (dir -> updatedVector)
}
我还使用Vector
而不是List
,因为列表是O(n)以在末尾插入每个元素。