0

以下のscalaコードでファイルの名前にアクセスするにはどうすればよいですか:

object FileMatcher {

  private def filesHere = (new java.io.File("c:\\")).listFiles

  def filesEnding(query: String) = 
    for (file <- filesHere; if file.getName.endsWith(query))
      yield file.getName

  def main(args: Array[String]) {
      println(filesEnding(".js"))  
    }

}

1 つの .js ファイルがあり、出力は [Ljava.io.File;@df8f5e] です。

「yield file」を「yield file.getName」に変更しようとしましたが、結果は同じです。

私は println(filesEnding(".js")) が def 'filesEnding' が生成するものの toString メソッドを呼び出すと仮定していますが、これは正しいですか?

4

3 に答える 3

3

filesEndingArray[String](使用する場合yield file.getNameArray[File]使用する場合yield filetoString配列のメソッドを生成します。これがデフォルトのtoString実装です。これは印刷されたハッシュコードです...そしてこれはまさにあなたが得ているものです. println(filesEnding(".js").mkString("\t","\n\t","\n"))ファイルをきれいに印刷する必要があることをおそらく意味していました。

于 2012-10-04T22:50:13.967 に答える
1

File には、Files の代わりに名前をリストする list と呼ばれる作業を減らす別の方法があります。検索対象のファイルが見つからない状態を処理する方法に応じて、スローされた例外を処理するか、必要な 1 つのファイル名を直接受け取ることができます。

val jsFile = new File("C:\\").list.find(_ endsWith ".js").head

またはオプションを生成し、次の例外を回避します。

val jsFileOpt = new File("C:\\").list.find(_ endsWith ".js").headOption

ただし、ディレクトリ以外のパスを File コンストラクターに渡すと、例外が発生して失敗します。それを防ぐために、オプションで null の可能性のあるリストをラップします。ディレクトリのコンテンツが返されると、Option[Array[String]] が返されます。それ以外の場合は None になります。Find は Option[Option[String]] を返すので、flatMap を使用してこの結果をフラット化し、Option[String] に戻します。

val jsFileOpt = Option(new File("C:\\").list).flatMap(_.find(_ endsWith ".js"))

エラーを無視して結果を直接処理するには、マップ操作で上記の抽出コードを使用します。

Option(new File("C:\\").list).flatMap(_.find(_ endsWith ".js")) map {n =>
  // whatever you want to do with the file name.
}

独自のコードを変更せずに、返された配列の最初の要素を抽出するだけに適応させる

filesEnding(".js").head 
于 2012-10-06T07:03:56.237 に答える
0

1 つのライナーで:

(new java.io.File("c:\\")).listFiles filter { _.getName.endsWith(query) } map { _.getName } foreach println

当然、query必要なものに置き換えるか、クエリという名前の引数を使用して定義に行を入れます。

于 2012-10-05T03:05:56.490 に答える