我有一个java.io.File,例如
/foo/bar/baz
我想获得文件的“顶级”父级,在本例中为
/foo/
显然,这是特定于Linux的 - 我并不担心跨平台兼容的解决方案,但如果它更优雅的话!
我在Scala中设法提出的最好成绩如下:
def topParent( file : File ) : File =
{
var temp = file
while ( temp.getParent != "/" ) temp = temp.getParentFile
temp
}
具有以下行为:
scala> topParent( new java.io.File( "/foo/bar/baz" ) )
res14: java.io.File = /foo
但似乎有点不雅观。有没有人有更好的解决方案?
答案 0 :(得分:0)
有一个递归解决方案在函数样式中使用尾递归执行相同的操作,正如bmorris591在注释中指出的那样:
@tailrec def topParent(file: File): File =
if(file.getParent == "/") file else topParent(file.getParentFile)
答案 1 :(得分:0)
您可能希望使用getCanonicalFile
来确保其格式正确。
我不确定你认为更优雅;无论如何,你必须一路走回去。您也可以执行类似
的操作def topParent(file: File): Option[File] = {
Iterator.iterate(file.getCanonicalFile)(_.getParentFile).
takeWhile(_ != null).
toList.
reverse.
drop(1).
headOption
}
至少避免让父母两次。