Scala:如何将 Seq[Array[String]] 转换为 Seq[Double]?
Scala: How to convert a Seq[Array[String]] into Seq[Double]?
我需要将 Seq[Array[String]] 类型的数据拆分为两个 Seq[Double] 类型的项目。
样本数据:([4.0|1492168815],[11.0|1491916394],[2.0|1491812028]).
我用过
var action1, timestamp1 = seq.map(t =>
(t.split("|"))).flatten.asInstanceOf[Seq[Double]]
但没有得到预期的结果。寻找宝贵的建议。
假设您的输入格式为 "[double1|double2]"
,
scala> Seq("[4.0|1492168815]","[11.0|1491916394]","[2.0|1491812028]")
res72: Seq[String] = List([4.0|1492168815], [11.0|1491916394], [2.0|1491812028])
删除[
和]
,然后用\|
拆分,|
是正则表达式中的元字符。
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))
然后将它们分成两个 Seq[Double]
你可以
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[Double] 类型的项目。
样本数据:([4.0|1492168815],[11.0|1491916394],[2.0|1491812028]).
我用过
var action1, timestamp1 = seq.map(t =>
(t.split("|"))).flatten.asInstanceOf[Seq[Double]]
但没有得到预期的结果。寻找宝贵的建议。
假设您的输入格式为 "[double1|double2]"
,
scala> Seq("[4.0|1492168815]","[11.0|1491916394]","[2.0|1491812028]")
res72: Seq[String] = List([4.0|1492168815], [11.0|1491916394], [2.0|1491812028])
删除[
和]
,然后用\|
拆分,|
是正则表达式中的元字符。
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))
然后将它们分成两个 Seq[Double]
你可以
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))