1

いくつかの列 [String Double Double Double Double] を含むテキスト ファイルを照合しています。ファイル [String Double Double] および [String Double Double] の各行について、次を取得したいと思います。ここで、文字列は両方のラベルと同じですが、最初の 2 つの double と最後の 2 つの double を 2 つの独立した行に分割しています。

私は動作していない以下を使用しています:

val out = Source.fromFile(filename).getLines.collect(_.split("\\s+").toList match {
      case s1 :: points1 :: points2 => (s1,"4",Point(points1.map(_.toDouble).toIndexedSeq))
                                    => (s1,"6",Point(points2.map(_.toDouble).toIndexedSeq))

私のダブルはポイントの座標です。

4

1 に答える 1

2

まず、2番目の列と残りの列points1に一致します。points2これは、::表記では左側がリストの最初の要素(ヘッド)であるのに対し、2番目は残りのサブリスト(テール)であるためです。

次のように、行をすべての列のリストに分解するのは簡単かもしれません。

... match {
  case s1 :: p1x :: p1y :: p2x :: p2y :: Nil =>

次に、それを2行に再構成して、2要素リストに配置します。

=> List( (s1,"4",Point(Vector(p1x,p1y).map(_.toDouble))),
         (s1,"6",Point(Vector(p2x,p2y).map(_.toDouble))) )

ただし、結果としてList [List [..]]が作成されるため、フラット化する必要があります。最も簡単な方法は、flatMapの代わりに使用することですcollect

したがって、完全なコードは次のようになります。

val out = Source.fromFile(filename).getLines.flatMap(_.split("\\s+").toList match {
  case s1 :: p1x :: p1y :: p2x :: p2y :: Nil => 
    List( (s1,"4",Point(Vector(p1x,p1y).map(_.toDouble))),
          (s1,"6",Point(Vector(p2x,p2y).map(_.toDouble))) )
})
于 2013-02-21T18:53:35.140 に答える