2012-08-24 130 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後。