我要填充包含标题和页脚字符串的字符串列表,主要内容是本地读取的文件。 下面的文本文件'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"))
}
答案 0 :(得分:4)
由于List是不可变的,我想你要么:
使用可变的ListBuffer并允许您附加数据:
val fileList = new ListBuffer[String]()
fileList += "begin"
或者,您可以尝试在groupedLines上使用foldLeft来生成新结构:
groupedLines.foldLeft(List[String]()){ (newList, items) =>
newList ::: "begin" :: items._1 ::: "end" :: Nil
}
答案 1 :(得分:2)
使用折叠或递归可能是更好的样式,但要直接回答您的问题,每次都将fileList的引用更改为新的List。如果您只想要一个字符串列表,不确定为什么要弄乱StringBuilder
。
List
不是添加内容的好选择,尽管你可以在前置时使用它,然后在最后反转所有内容。我使用Vector
,但这里是List
:
fileList ::= "begin"
lines foreach {fileList ::= _}
fileList ::= "end"
然后在groupedLines foreach
块之后
fileList = fileList.reverse
请注意,a ::= b
是a = b :: a
的语法糖。
答案 2 :(得分:2)
以下方法在Scala中更为自然:
val bigFile = io.Source.fromFile("textFile.txt")
val groupedLines = bigFile.getLines.grouped(20000)
val fileList = groupedLines.flatMap("begin" +: _ :+ "end").toList
没有var
,可变集合或必要的折叠。您可以将最后一行等效地写为:
val fileList = groupedLines.map("begin" +: _ :+ "end").flatten.toList
这不像flatMap
版本那样惯用,但它使我们做得更清楚一点:我们将每个组点缀,然后将它们全部粉碎。