2017-08-27 49 views
0

我正在做一个示例程序:从文件列表中添加文件名列表。但是我在添加后得到一个空列表。不添加元素的斯卡拉列表

我的代码是这样的:在控制台

val regex = """(.*\.pdf$)|(.*\.doc$)""".r 
val leftPath = "/Users/ravi/Documents/aa" 

val leftFiles = recursiveListFiles(new File(leftPath), regex) 
var leftFileNames = List[String]() 

leftFiles.foreach((f:File) => {/*println(f.getName);*/ f.getName :: leftFileNames}) 

leftFileNames.foreach(println) 

def recursiveListFiles(f: File, r: Regex): Array[File] = { 
    val these = f.listFiles 
    val good = these.filter(f => r.findFirstIn(f.getName).isDefined) 
    good ++ these.filter(_.isDirectory).flatMap(recursiveListFiles(_, r)) 
} 

最后一条语句没有显示任何东西。

回答

1

f.getName :: leftFileNames手段添加到f.getNameleftFileNames开始并返回一个新List,所以不会加入到leftFileNames。所以对于你的榜样,你需要每次操作后分配leftFileNames,如:

leftFiles.foreach((f:File) => leftFileNames = f.getName :: leftFileNames) 

但最好不要使用可变变量斯卡拉,它会导致副作用,你可以使用mapreverse为此,如:

val leftFileNames = leftFiles.map(_.getName).reverse 
+0

感谢@chengpohi,它的工作。 – Sun