【问题标题】:tail-recursive list all sub-directories for the given file location尾递归列出给定文件位置的所有子目录
【发布时间】:2014-10-22 04:20:55
【问题描述】:

我想获取给定文件位置的所有非空目录,例如:

/src/abc
/src/abc/123/123.txt
/src/abc/abc/123.txt
/src/abc/foo/123.txt

我想获取 Seq[String]

/src/abc/123
/src/abc/abc
/src/abc/foo

我使用这个代码。

def getAllDirectories(location: String): Seq[String] = {

    def recursiveListDirectories(f: File): Seq[File] = {
      val these = f.listFiles
      val directories = these.filter(_.isDirectory)
      directories ++ directories.flatMap(recursiveListDirectories)
    }
    recursiveListDirectories(new File(location)).filter(t => !t.listFiles().forall(_.isDirectory)).map(_.getPath)
  }

我想知道如何使 recursiveListDirectories 方法尾递归?

在此先感谢

【问题讨论】:

标签: scala tail-recursion


【解决方案1】:

设置你的内部函数来保存结果目录的累积列表,以及它仍然需要检查的目录。依次尝试每个要检查的目录,将任何子目录添加到下一个呼叫的等待列表中。例如:

def getAllDirectories(location: String): Seq[String] = {

  def go(toCheck: List[File], results: List[File]): Seq[File] = toCheck match {
    case head :: tail =>
      val these = head.listFiles
      val directories = these.filter(_.isDirectory)
      val updated = if (these.size == directories.size) results else head :: results
      go(tail ++ directories, updated)
    case _ => results
  }

  go(new File(location) :: Nil, Nil).map(_.getPath)
}

【讨论】:

    猜你喜欢
    • 2020-08-19
    • 1970-01-01
    • 2010-10-19
    • 2020-06-08
    • 1970-01-01
    • 2010-10-04
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多