Scala:如何将Seq[Array[String]]转换为Seq[Double]?

Scala:如何将Seq[Array[String]]转换为Seq[Double]?,scala,seq,Scala,Seq,我需要将Seq[Array[String]]类型中的数据拆分为两个Seq[Double]类型的项 样本数据:([4.0 | 1492168815],[11.0 | 1491916394],[2.0 | 1491812028]) 我曾经 var action1,timestamp1=seq.map(t=> (t.split(“|”).flatte.asInstanceOf[Seq[Double]] 但是没有得到预期的结果。寻找有价值的建议。假设您的输入格式为“[double1 | double2]

我需要将Seq[Array[String]]类型中的数据拆分为两个Seq[Double]类型的项

样本数据:([4.0 | 1492168815],[11.0 | 1491916394],[2.0 | 1491812028])

我曾经
var action1,timestamp1=seq.map(t=>
(t.split(“|”).flatte.asInstanceOf[Seq[Double]]

但是没有得到预期的结果。寻找有价值的建议。

假设您的输入格式为“[double1 | double2]”

删除
[
]
,然后按
\\\\\\\\\\\\\\\
拆分,
是正则表达式中的元字符

scala> res72.flatMap {_.dropRight(1).drop(1).split("\\|").toList}.map{_.toDouble}
res74: Seq[Double] = List(4.0, 1.492168815E9, 11.0, 1.491916394E9, 2.0, 1.491812028E9)
或者你可以

scala> val actTime = seq.flatMap(t => t.map(x => { val temp = x.split("\\|"); (temp(0), temp(1))}))
actTime: Seq[(String, String)] = List((4.0,1492168815), (11.0,1491916394), (2.0,1491812028))
scala> val action1 = actTime.map(_._1.toDouble)
action1: Seq[Double] = List(4.0, 11.0, 2.0)

scala> val timestamp1 = actTime.map(_._2.toDouble)
timestamp1: Seq[Double] = List(1.492168815E9, 1.491916394E9, 1.491812028E9)
要将它们分成两个
Seq[Double]
您可以

scala> val actTime = seq.flatMap(t => t.map(x => { val temp = x.split("\\|"); (temp(0), temp(1))}))
actTime: Seq[(String, String)] = List((4.0,1492168815), (11.0,1491916394), (2.0,1491812028))
scala> val action1 = actTime.map(_._1.toDouble)
action1: Seq[Double] = List(4.0, 11.0, 2.0)

scala> val timestamp1 = actTime.map(_._2.toDouble)
timestamp1: Seq[Double] = List(1.492168815E9, 1.491916394E9, 1.491812028E9)
如果输入中可能存在非双精度数据,则应使用
Try
进行更安全的
double
转换

scala> Seq("[4.0|1492168815]","[11.0|1491916394]","[2.0|1491812028]", "[abc|abc]")
res75: Seq[String] = List([4.0|1492168815], [11.0|1491916394], [2.0|1491812028], [abc|abc])

scala> import scala.util.Success
import scala.util.Success

scala> import scala.util.Try
import scala.util.Try

scala> res75.flatMap {_.dropRight(1).drop(1).split("\\|").toList}
            .map{d => Try(d.toDouble)}
            .collect {case Success(x) => x }
res83: Seq[Double] = List(4.0, 1.492168815E9, 11.0, 1.491916394E9, 2.0, 1.491812028E9) 

使用正则表达式组提取输入列表中的每个项,正则表达式组以
[
]
分隔

val pat = "\\[(.*)\\|(.*)\\]".r
因此,如果我们假设一个输入,例如

val xs = List("[4.0|1492168815]","[11.0|1491916394]","[2.0|1491812028]")
考虑

xs.map { v => val pat(a,b) = v; (a.toDouble, b.toLong) }.unzip
在这里,我们将
pat
中定义的正则表达式应用于列表的每个项目,对每个项目的每个组进行元组分析,最后
unzip
将它们解压,以便将元组分成单独的集合;即

(List(4.0, 11.0, 2.0),List(1492168815, 1491916394, 1491812028))

您的Seq[Array[String]]的元素是什么?或者你能展示一下seq是什么吗?这就是我的seq[Array[String]]的样子([4.0 | 1492168815],[11.0 | 1491916394],[2.0 | 1491812028])