如何基于现有数组值创建唯一值的集合

时间:2012-10-16 20:37:12

标签: scala

下面的代码打印一个fileNames数组。

  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)
  }

5 个答案:

答案 0 :(得分:2)

这将正确处理没有扩展名的文件(通过忽略它们)

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

所以

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

变为

Array("jpg", "png")

答案 1 :(得分:1)

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

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

这就是你要找的东西吗?

答案 2 :(得分:1)

你可以这样做:

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

这假定您的所有文件名都有扩展名,而您只想要最后一个扩展名。即something.html.erb的扩展名为“erb”

答案 3 :(得分:1)

为了完整起见:

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

这里我假设所有扩展都是3个字符长。转换为Set,就像.distinct方法(顺便使用下面的可变集),在其他答案中为您提供了独特的项目。

答案 4 :(得分:1)

您也可以使用regex来实现,它提供了更通用的解决方案,因为您可以重新定义表达式以匹配您想要的任何内容:

val R = """.*\.(.+)""".r
getFiles.collect{ case R(x) => x }.distinct