如何使用单独的List填充字符串列表

时间:2012-08-24 20:01:58

标签: scala

我要填充包含标题和页脚字符串的字符串列表,主要内容是本地读取的文件。 下面的文本文件'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"))
  }

3 个答案:

答案 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 ::= ba = 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版本那样惯用,但它使我们做得更清楚一点:我们将每个组点缀,然后将它们全部粉碎。