1

以下のコードは、ファイル名の配列を出力します。

  val pdfFileArray = getFiles()
  for(fileName <- pdfFileArray){
    println(fileName)
  }

この配列 (pdfFileArray) を、一意のファイル名拡張子を含む配列に変換しようとしています。

scala でこれを行う正しい方法は以下のようなものですか?

  Set<String> fileNameSet = new HashSet<String>
  val pdfFileArray = getFiles()
  for(fileName <- pdfFileArray){
    String extension = fileName.substring(fileName.lastIndexOf('.'));
    fileNameSet.add(extension)
  }
4

5 に答える 5

2

これにより、拡張子のないファイルが適切に処理されます (無視されます)。

val extensions = getFiles().map{_.split('.').tail.lastOption}.flatten.distinct

それで

Array("foo.jpg", "bar.jpg", "baz.png", "foobar")

になる

Array("jpg", "png")
于 2012-10-16T20:51:12.610 に答える
1

正規表現を使用してこれを行うこともできます。これにより、式を再定義して必要なものに一致させることができるため、より一般的な解決策が得られます。

val R = """.*\.(.+)""".r
getFiles.collect{ case R(x) => x }.distinct
于 2012-10-17T02:17:29.090 に答える
1

あなたはこれを行うことができます:

val fileNameSet = pdfFileArray.groupBy(_.split('.').last).keys

これは、すべてのファイル名に拡張子があり、最後の拡張子のみが必要であると想定しています。つまり、something.html.erb の拡張子は「erb」です。

于 2012-10-16T20:45:39.153 に答える
1

完全を期すために:

List("foo.jpg", "bar.jpg").map(_.takeRight(3)).toSet

ここでは、すべての拡張子が 3 文字の長さであると想定しています。Set への変換は、他の回答で .distinct メソッド (ちなみに、可変セットを使用します) と同じように、一意のアイテムを提供します。

于 2012-10-16T20:59:54.380 に答える
1

scala のコレクションには と呼ばれるメソッドがありdistinct、コレクション内のすべての重複エントリを取り除きます。たとえば、次のようになります。

scala> List(1, 2, 3, 1, 2).distinct
res3: List[Int] = List(1, 2, 3)

それはあなたが探しているものですか?

于 2012-10-16T20:41:40.497 に答える