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の参照を毎回新しいリストに変更します。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 に答える