在Scala中将文件名拆分为绝对路径



给定字符串

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

如何使用Scala为path中的每个目录创建一个绝对路径列表?结果应该是:

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

优雅、实用的解决方案可获得额外积分。

val path = "/what/an/awesome/path"
val file = new java.io.File(path)
val prefixes = Iterator.iterate(file)(_.getParentFile).takeWhile(_ != null).toList.reverse
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)

使用Jesse Eichar的新Scala IO库(版本0.2.0(,您可以执行以下操作:

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

您可能希望将结果列表中的Path对象转换为Strings,但如果将它们保留为Path对象,可能会更安全、更有用。

据我所知,这个库正在考虑纳入Scala发行版。

path.drop(1).split("/").foldLeft(List.empty[String])((list, string) => ((list.headOption.getOrElse("") + "/" + string) :: list)).reverse.toList

使用scanLeft可能有一种更干净的方法,但我没能弄清楚

花式裤子正则表达式方法:

val R = "(/.*)/".r
(path + '/').inits.collect{case R(x) => x}.toList

最新更新