1

私は Scala を初めて使用するので、実験中です。次のコードは、D:\Downloads の下にあるすべてのファイルの名前を再帰的に出力します。

import java.io.File

object Run {
  def main (args: Array[String]){
    //read each file
    val f = new File("""D:\Downloads""");
    listFiles(f)
  }

  def listFiles(f: Any): Unit= f match{
    case f:File if f.isDirectory => f.listFiles().deep.foreach(listFiles(_))
    case f:File if f.isFile => println(f.getName)
    case _ => Unit
  }
}

これは機能します。ここで、listFiles で文字列のリストを作成し、それを返したいと思います。これは私がやったことです:

  def listFiles(f: Any): List[String] = f match{
    case f:File if f.isDirectory => f.listFiles().foreach(listFiles(_))
    case f:File if f.isFile => List(f.getName)
    case _ => Nil
  }

f がディレクトリの場合、foreach は listFiles を再帰的に呼び出す必要があり、List が返されます。これらの配列をすべて連結して返すにはどうすればよいですか? これを行うより良い方法はありますか?

4

4 に答える 4

5

あなたのアプローチから作業して、次を使用しますflatMap

def listFiles(f: Any): List[String] = f match{
  case f:File if f.isDirectory => f.listFiles().toList.flatMap(listFiles(_))
  case f:File if f.isFile => List(f.getName)
  case _ => Nil
}
于 2013-09-18T16:53:37.063 に答える
2

ファイルのリストでa を使用する必要がflatmapありますが、私は for-comprehensions の外観が好きなので、次のようにします。

 def listFiles(f: Any): List[String] = f match {
   case d: File if d.isDirectory => for {
      file <- d.listFiles.toList
      fileName <- listFiles(file)
      } yield fileName

   case f: File if f.isFile => List(f.getName)
   case _ => Nil
 }    

別の注意として、より強力な型安全性を求めて、メソッドを次のように定義する必要があります。

 def listFiles(f:File): List[String]

この方法では、引数を指定してのみ呼び出すことがFileでき、コンパイル時により多くのエラーをキャッチできます。

于 2013-09-18T16:59:07.237 に答える