15

我想在具有 4 个元素的空格上拆分一个字符串:

1 1 4.57 0.83

我正在尝试转换为 List[(String,String,Point)] 以便前两个拆分是列表中的前两个元素,后两个是 Point。我正在执行以下操作,但似乎不起作用:

Source.fromFile(filename).getLines.map(string => { 
            val split = string.split(" ")
            (split(0), split(1), split(2))
        }).map{t => List(t._1, t._2, t._3)}.toIterator
4

5 回答 5

16

这个怎么样:

scala> case class Point(x: Double, y: Double)
defined class Point

scala> s43.split("\\s+") match { case Array(i, j, x, y) => (i.toInt, j.toInt, Point(x.toDouble, y.toDouble)) }
res00: (Int, Int, Point) = (1,1,Point(4.57,0.83))
于 2013-02-20T04:52:09.077 回答
14

您可以使用模式匹配从数组中提取您需要的内容:

    case class Point(pts: Seq[Double])
    val lines = List("1 1 4.34 2.34")

    val coords = lines.collect(_.split("\\s+") match {
      case Array(s1, s2, points @ _*) => (s1, s2, Point(points.map(_.toDouble)))
    })
于 2013-02-20T04:39:03.810 回答
1
case class Point(pts: Seq[Double])
val lines = "1 1 4.34 2.34"

val splitLines = lines.split("\\s+") match {
  case Array(s1, s2, points @ _*) => (s1, s2, Point(points.map(_.toDouble)))
}

出于好奇,模式匹配中的 @ 将变量绑定到模式,因此points @ _*将变量点绑定到模式 *_ 并且 *_ 匹配数组的其余部分,因此 points 最终成为 Seq[String]。

于 2013-07-12T00:56:00.717 回答
1

您没有将第三个和第四个标记转换为 a Point,也没有将行转换为 a List。此外,您不是将每个元素呈现为Tuple3,而是呈现为List.

以下内容应该更符合您的要求。

case class Point(x: Double, y: Double) // Simple point class
Source.fromFile(filename).getLines.map(line => { 
    val tokens = line.split("""\s+""") // Use a regex to avoid empty tokens
    (tokens(0), tokens(1), Point(tokens(2).toDouble, tokens(3).toDouble))
}).toList // Convert from an Iterator to List
于 2013-02-20T03:51:07.553 回答
-1

有多种方法可以将元组转换为列表或序列,一种方法是

scala> (1,2,3).productIterator.toList
res12: List[Any] = List(1, 2, 3)

但正如您所看到的,返回类型是Any而不是INTEGER

为了转换成不同的类型,你使用 https://github.com/milessabin/shapeless的 Hlist

于 2013-02-20T06:16:54.817 回答