2012-08-24 94 views
1

我正在填充包含页眉和页脚的字符串列表,主要内容是本地读取文件。 下面的文本文件'textFile'包含一个字符串列表。如何使用单独的列表填充字符串列表

这里就是我想:

 var fileList = List[String]() 
    val bigFile = io.Source.fromFile("d:\\textFile.txt") 
    val groupedLines = bigFile.getLines.grouped(20000).zipWithIndex 
    groupedLines.foreach(group => { 
     val (lines, index) = group 
     fileList.addString(new StringBuilder("begin")) 

     //How can I add the contents of the file here to the val fileList ??? 
     fileList.add(lines.) 
     fileList.addString(new StringBuilder("end")) 
    } 

回答

2

下面的办法是更自然的斯卡拉:

val bigFile = io.Source.fromFile("textFile.txt") 
val groupedLines = bigFile.getLines.grouped(20000) 
val fileList = groupedLines.flatMap("begin" +: _ :+ "end").toList 

没有var S,可变集合,或折叠必要的。你能等效写的最后一行是:

val fileList = groupedLines.map("begin" +: _ :+ "end").flatten.toList 

这不是因为flatMap版本地道,但它是我们正在做的更清晰一点:我们bookending每个组再砸他们都在一起。

+0

什么任务是在最后一行完成的,原因是我问的最后一行似乎没有编译? –

+0

它被称为占位符语法,它只是'groupedLines.flatMap(x =>“begin”+:x:+“end”)。toList'的简写。它应该工作(并为我做)。什么是错误信息。 –

4

由于名单是不可改变的,我认为你要么想:

使用ListBuffer是可变的,将允许您添加数据:

val fileList = new ListBuffer[String]() 
fileList += "begin" 

或者,你可以尝试使用上groupedLines foldLeft产生一个新的结构:

groupedLines.foldLeft(List[String]()){ (newList, items) => 
    newList ::: "begin" :: items._1 ::: "end" :: Nil 
} 
2

使用折叠或递归可能是更好的样式,但要直接回答您的问题,请每次将fileList的引用更改为新列表。不知道为什么如果你只是想要一个字符串列表,你为什么要搞乱StringBuilder

List对于追加事物的收集并不是一个好的选择,但是如果您预先安排,您可以使用它,然后在最后颠倒一切。我会用Vector,但在这里它与List

fileList ::= "begin" 
lines foreach {fileList ::= _} 
fileList ::= "end" 

那么groupedLines foreach

fileList = fileList.reverse 

笔记,a ::= b是语法糖a = b :: a后。