1

2 列の整数を含む大きなテキスト ファイルを読みたいと思います。最初の列が一定である連続するストレッチごとに、2 番目の列をリストとして収集したいと考えています。例として、次のサンプル

1 2
1 1
1 2
4 3
4 8
1 5
8 2
8 2
8 7

リストを生成する必要があります

2,1,2
3,8
5
2,2,7

Scalaでこれを達成する適切な方法は何ですか?

特に、最初にファイル全体をメモリにロードしなくても各リストを処理できるように、「怠惰な」ソリューションがあれば非常に便利です。

4

2 に答える 2

1
val nums = """(\d+) (\d+)""".r

val tuples = io.Source.fromFile("list.txt").getLines collect {
  case nums(label, num) => (label.toInt -> num.toInt)
}

def toList(tuples: Iterator[(Int, Int)]): Iterator[Seq[Int]] = {
  if(!tuples.hasNext) Iterator.empty
  else {
    val (label, num) = tuples.next
    val (succ, rest) = tuples.span(_._1 == label)
    Iterator(num :: succ.map(_._2).toList) ++ toList(rest)
  }
}

toList(tuples)foreach(println)
于 2013-08-12T21:54:51.040 に答える
1

最も簡単な方法は、 を使用scala.io.Sourceしてファイルを 1 行ずつ読み取ることです。を使用すると、マップして行を分割し、次のように int に変換getLinesできる を取得できます。Iterator[String]

val intPairs = Source.fromFile("/path/to/file").getLines.map { line =>
  line.split(" ").take(2).map(_.toInt)
}

連続する行のグループ化は演習として残しておきます。

于 2013-08-12T14:15:28.710 に答える