我想在包含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
答案 0 :(得分:14)
这个怎么样:
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))
答案 1 :(得分:10)
您可以使用模式匹配从数组中提取所需内容:
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 :(得分: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
答案 3 :(得分: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)))
}
好奇的是,@ in模式匹配将变量绑定到模式,因此points @ _*
将变量点绑定到模式* _和* _匹配数组的其余部分,因此点结束是Seq [String]。
答案 4 :(得分:-1)
有一些方法可以将元组转换为List或Seq,其中一种方法是
scala> (1,2,3).productIterator.toList
res12: List[Any] = List(1, 2, 3)
但是你可以看到返回类型是任何而不是 INTEGER
要转换为不同类型,请使用Hlist https://github.com/milessabin/shapeless