有许多文件夹包含每日构建工件。我需要获取最新的文件夹来测试其中的某些部分。折叠的名称具有以下样式
xx.172-3
xx是一个稳定的数字,可以忽略。 172是按时间顺序排列的第172个建筑。 3是172的第三个版本。文件夹名称的长度不一致。在34.120-11之前可能有34.99-0
在 / test 路径下的典型文件夹是
/test |-/34.170-0/
|-/34.171-0/
|-/34.171-1/
|-/34.172-0/
|-/34.171-1/
|-/34.171-2/
|-/34.171-3/
问题:
如何使用Scala找到最新的构建文件夹 /34.171-3 ?
注意:
我已经考虑过使用时间戳,但是它不起作用。因为在构建后可以自由访问以前的文件夹。时间戳不能告诉您它是否是最新版本
答案 0 :(得分:3)
您可以使用Regex模式来确保目录名称可安全比较。
val dirPattern = raw"\d+.(\d+)-(\d+)".r
listOfDirNames.maxBy{
dirPattern.unapplySeq(_)
.collect{case List(a,b) => (a.toInt,b.toInt)}
.getOrElse((0,0))
}
答案 1 :(得分:1)
您可以定义一个将文件名解析为3个数字的元组的方法:
import scala.util.Try
def parse(s: String) = s.split("[.-]") match { //simple one case thanks to jwvh ;)
case Array(_, a, b) => Try(a.toInt, b.toInt).toOption //in case there's folder like 34.xxx-0
case _ => None
}
然后使用它来查找最后一个文件:
val lastFile = new File("/test")
.listFiles(_.isDirectory)
.maxBy(f => parse(f.getName))
在 Scala 2.13 中,您还可以这样做:
def parse(s: String) = s match {
case s"${_}.$a-$b" => Try(a.toInt, b.toInt).toOption
case _ => None
}
可以说更具可读性。