Непонятно, что вам нужно для производительности, даже если вы упоминаете «алгоритм».
При условии, что у вас нет особых потребностей, что-то вроде этого легко сделать с помощью Scala Collection API.,Даже если вы работали с огромными каталогами, вы, вероятно, могли бы достичь хороших характеристик производительности, перейдя в Streams (по крайней мере, при использовании памяти).
Итак, если у вас есть функция, подобная def getFilesFromDir(path: String): List[String]
, где List[String]
это список имен файлов, вам нужно сделать следующее:
- Группировать файлы по дате (
List[String] => Map[String, List[String]]
- Извлечь Runnumbers, сохранив исходное имя файла (
List[String] => List[(String, Int)]
) - Выберите максимальное число Runnumber (
List[(String, Int)] => (String, Int)
) - Сопоставить только с именем файла (
(String, Int) => String
) - Выберите только значения полученной карты (
Map[Date, String] => String
)
( Примечание : если вы хотите пойти по чисто функциональному маршруту, вам понадобится функция, похожая на def getFilesFromDir(path: String): IO[List[String]]
)
С Scala's Collections API выВы можете достичь вышеуказанного с помощью чего-то вроде этого:
def extractDate(fileName: String): String = ???
def extractRunnumber(fileName: String): String = ???
def getLatestRunnumbersFromDir(path: String): List[String] =
getFilesFromDir(path)
.groupBy(extractDate) // List[String] => Map[String, List[String]]
.mapValues(selectMaxRunnumber) // Map[String, List[String]] => Map[String, String]
.values // Map[String, String] => List[String]
def selectMaxRunnumber(fileNames: List[String]): String =
fileNames.map(f => f -> extractRunnumber(f))
.maxBy(p => p._2)
._1
Я оставил пустыми реализации extractDate
и extractRunnumber
. Это можно сделать с помощью простых регулярных выражений - дайте мне знать, если у вас возниклипроблема с этим.