0

我正在使用以下代码遍历目录并将文件添加mutable Mapmutable 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]]?是否有更“实用”的方式来实现相同的结果?

4

1 回答 1

0

java.nio.file软件包两者都有SimpleFileVisitorFiles这应该会使这变得容易得多。子类SimpleFileVisitor,覆盖preVisitDirectoryvisitFile;然后用Files.walkFileTree.

但对您的问题更一般的答案是这是一个折叠操作,因此使用您现有的代码它看起来像:

filesIterator.foldLeft(Map.empty[String, Seq[String]]) { case (map, file) =>
  ...
  // return an updated map
  map + (dir -> updatedVector)
}

我也会使用 aVector而不是 a List,因为列表是 O(n) 在末尾插入每个元素。

于 2016-03-19T22:46:49.090 回答