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

scala 的集合中有一个名为 的方法distinct,它会删除集合中的所有重复条目。例如:

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

那是你要找的吗?

于 2012-10-16T20:41:40.497 回答
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

您也可以使用正则表达式来执行此操作,它提供了更通用的解决方案,因为您可以重新定义表达式以匹配您想要的任何内容:

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