3

私は初心者で、ファイルを読み取ってVector[Vector[Char]]を作成しようとしています。ファイルの各行は、異なるベクトルになるはずです。

これが私が思いついたものです:

val empty: Vector[Vector[Char]]       = Vector()
lazy val lines: List[String]          = Source.fromFile("test.txt").getLines.toList
lazy val vecList: List[Vector[Char]]  = lines.map(str => Vector(str: _*))
lazy val vector: Vector[Vector[Char]] = vecList.foldRight(empty) (_ +: _)

ファイルが大きくなることはないため、スケーラビリティは問題になりません。上記のコードは機能しているように見えますが、納屋のあちこちを回っているように感じます。これを行うためのより簡単で直接的な方法はありますか?

4

4 に答える 4

5

以下は、Scala 2.10 を使用したソリューションです。

source.getLines.to[Vector].map(_.to[Vector])
于 2012-11-10T16:54:50.260 に答える
1

上記のコメントで述べたようにIndexedSeq、特定のインデックスの要素を一定時間で取得できるようにする必要がある場合に使用する方が慣用的です。の現在のデフォルト実装はIndexedSeqですVector。したがって、次のように記述します。

val xs = IndexedSeq(1, 2, 3)

Vector[Int]実際には舞台裏を見ることができますが、静的に。として型指定されているため、これは実装の詳細にすぎませんIndexedSeq[Int]。将来、よりパフォーマンスの高い新しいデフォルトの実装が導入された場合は、この変更を無料で利用できます。

また、を使用すると、Scala 2.10の新しいメソッドIndexedSeqに依存することなく、この操作を非常に簡潔に記述できます。to他の場所で開いたり閉じたりするソースがあると仮定するとs、必要なのはこれだけです。

val lines: IndexedSeq[IndexedSeq[Char]] = s.getLines.map(wrapString).toIndexedSeq

文字列を文字のシーケンスとして扱うことをサポートするためにwrapString提供されるメソッドはどこにありますか。scala.Predef

于 2012-11-10T18:02:14.920 に答える
1
import scala.io.Source

2.9 以前:

Vector() ++ Source.fromFile("test.txt").getLines.map(Vector() ++ _)

2.10以降:

Source.fromFile("test.txt").getLines.map(_.to[Vector]).to[Vector]

(ベクトルを 2 回作成する必要がないように、最初に反復子にマップします。)

于 2012-11-10T18:16:38.227 に答える
0

少し改善、回避foldLeft():

Vector(Source.fromFile("test.txt").getLines.toSeq: _*) map {l => Vector(l: _*)}

Source.fromFile("test.txt")ただし、実際にはオブジェクトを閉じる必要があることに注意してください。

于 2012-11-10T16:52:18.747 に答える