下面的代码打印一个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)
}
答案 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