Разбить имя файла на абсолютные пути в Scala - PullRequest
5 голосов
/ 13 октября 2011

Учитывая строку

val path = "/what/an/awesome/path" 

, как я могу использовать Scala для создания списка абсолютных путей для каждого каталога в пути?Результат должен быть:

List(/what, /what/an, /what/an/awesome, /what/an/awesome/path)

Бонусные баллы за элегантное, функциональное решение.

Ответы [ 5 ]

13 голосов
/ 13 октября 2011
val path = "/what/an/awesome/path"
val file = new java.io.File(path)
val prefixes = Iterator.iterate(file)(_.getParentFile).takeWhile(_ != null).toList.reverse
8 голосов
/ 13 октября 2011
val path = "/what/an/awesome/path"

scala> path.tail.split("/").scanLeft(""){_ + "/" + _}.tail.toList
res1: List[java.lang.String] = List(/what, /what/an, /what/an/awesome, /what/an/awesome/path)
4 голосов
/ 13 октября 2011

Используя новую библиотеку Scala IO Джесси Эйхара (версия 0.2.0), похоже, что вы можете сделать что-то вроде этого:

val path  = Path("/what/an/awesome/path")
val paths = (path :: path.parents).reverse

Возможно, вы захотите преобразовать объекты Path в результирующем списке в строки, но, возможно, они будут безопаснее и полезнее оставить как объекты Path.

Эта библиотека, насколько я знаю, рассматривается для включения в дистрибутив Scala.

2 голосов
/ 13 октября 2011

Метод регулярных выражений в костюмах:

val R = "(/.*)/".r
(path + '/').inits.collect{case R(x) => x}.toList
2 голосов
/ 13 октября 2011
path.drop(1).split("/").foldLeft(List.empty[String])((list, string) => ((list.headOption.getOrElse("") + "/" + string) :: list)).reverse.toList

Вероятно, есть более чистый способ использования scanLeft, но я не смог понять это

...