1

我正在匹配一个包含一些列 [String Double Double Double Double] 的文本文件。我想为文件 [String Double Double] 和 [String Double Double] 的每一行获取以下内容,其中 String 是两者的标签相同,但我将前两个双打和最后两个双打分成两个独立的行。

我正在使用以下不起作用:

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

首先points1匹配您的第二列和points2其余列。这是因为在::符号左侧是列表的第一个元素(头),但第二个是其余子列表(尾)。

将行分解为所有列的列表可能很容易,如下所示:

... 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))) )

但是,结果你会得到一个 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 回答