将Scala字符串拆分为元组

16

我想将一个包含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

1
如果你想要一个元组,为什么要说你想要转换为列表? - Maurício Linhares
我同意,这个标题更应该接近将字符串转换为元素列表。 - Ben Schmidt
5个回答

17

这样怎么样:

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

简单明了。您可能需要添加一个处理输入错误的情况。 - Felix Trepanier

15
你可以使用模式匹配从数组中提取所需内容:
    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)))
    })

2
这段代码对我来说无法编译,我添加了另一个类似的可以编译的答案——我无法让代码在评论中正确显示。如果有人知道,我很想看看如何使用collect。 - Ryan K
collect的API中,翻译如下内容:“通过将部分函数应用于定义了函数域的所有元素,构建一个新的集合。”。这就像map,但只保留部分函数定义域内的元素。 - pagoda_5b

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绑定到模式*_上。*_匹配数组的其余部分,因此points最终成为一个Seq[String]。

嗯...我得到了scala.MatchError: [Ljava.lang.String;@7bfacd5d (类为[Ljava.lang.String;),我做错了什么? - Capacytron

1
你没有将第三和第四令牌转换为一个Point,也没有将行转换为一个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

我的Point类需要(IndexedSeq[Double]),那么我该如何从元组中获取Indexed Seq? - princess of persia

-1

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

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

但是你可以看到返回类型是 Any 而不是 INTEGER

要将其转换为不同的类型,您可以使用 https://github.com/milessabin/shapeless 的 Hlist


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接