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"))
  }
4

3 回答 3

4

由于 List 是不可变的,我认为您要么想要:

使用可变的 ListBuffer 并允许您附加数据:

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

或者,您可以尝试在 groupedLines 上使用 foldLeft 来生成新结构:

groupedLines.foldLeft(List[String]()){ (newList, items) => 
    newList ::: "begin" :: items._1 ::: "end" :: Nil
}
于 2012-08-24T20:20:47.163 回答
2

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

List不是附加东西的集合的好选择,虽然你可以在前面使用它,然后在最后反转所有内容。我会使用Vector,但这里是List

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

然后在groupedLines foreach块之后

fileList = fileList.reverse

注意,a ::= b是 . 的语法糖a = b :: a

于 2012-08-24T20:38:22.007 回答
2

以下方法在 Scala 中更为自然:

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

不需要vars、可变集合或折叠。您可以将最后一行等效地写为:

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

这不像flatMap版本那样惯用,但它使我们正在做的事情更加清晰:我们正在为每个组预订,然后将它们全部粉碎。

于 2012-08-24T23:24:11.953 回答