我们如何在scala中以字母数字的方式对列表进行排序



我有一个列表["img10", "img2", "img4", ...],我想对它进行排序并获得["Img1", "Img2", "Img3",...]。使用排序后的结果为["img1", "img10", "img100", ...]

假设只能有与IMG_1111.JPG或正则表达式D*d*.w+等名称匹配的名称,则可以在捕获正则表达式组的帮助下对序列进行排序,然后在数字前面加一个前导空格

import scala.jdk.StreamConverters._
val ImageNumberExt = raw"(D*)(d{1,10}).(w*)".r
Files
.list(Path.of("/path/to/folder"))
.toScala(LazyList)
.map(_.toFile)
.sortBy { f =>
f.getName match {
case ImageNumberExt(stringPrefix, number, ext) =>
stringPrefix + f"$number%10s" + ext
case str =>
str
}
}
.foreach(println)

假设所有文件都应该有相同的前缀,然后它们将有一个数字部分,最好的做法是根据数字部分进行排序,如下所示:

import java.io.File
val files: List[File] = ...
val filesSorted =
files.sortBy { file =>
// Tune as needed.
file.getName.trim.toLowerCase.stripPrefix(prefix = "img").toIntOption
}

最新更新