Scala模式匹配导致两个输出

时间:2013-02-21 18:18:40

标签: scala split match case

我正在匹配一个包含一些列[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))

我的双打是积分的坐标。

1 个答案:

答案 0 :(得分: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))) )
})