我必须将一堆愚蠢的逗号分隔的字符串转换为最终的对象.我首先将字符串拆分为Arrays.然后我需要同时迭代所有这些并从四个值中构建一个Object.
val s1 = Array(1,2,3)
val s2 = Array("a","b","c")
val s3 = Array(10,20,30)
val s4 = Array("u","v","w")
Run Code Online (Sandbox Code Playgroud)
目标Object如下所示:
case class Data(a: Int, b: String, c: Int, d: String)
Run Code Online (Sandbox Code Playgroud)
第一个Data对象必须打印
Data(1,a,10,u)
Run Code Online (Sandbox Code Playgroud)
等等.我找到了三个项目的解决方案:
(s1, s2, s3).zipped foreach { (v1, v2, v3) =>
println(v1, v2, v3)
}
Run Code Online (Sandbox Code Playgroud)
哪个印刷品:
(1,a,10)
(2,b,20)
(3,c,30)
Run Code Online (Sandbox Code Playgroud)
如果有四个或更多阵列,则不会这样做.Zipped没有为4元组定义:
error: value zipped is not a member of (Array[Int], Array[String], Array[Int], Array[String])
Run Code Online (Sandbox Code Playgroud)
我的Scala有点生疏,所以也许我错过了明显的东西(比如带索引的迭代或其他东西).
它不漂亮,但应该工作(具有任意数量的行长)
val items: Array[Array[Any]] = Array (
Array(1,2,3),
Array("a","b","c"),
Array(10,20,30),
Array("u","v","w")
)
items.transpose.map {
case Array(a: Int, b: String, c: Int, d: String) => Data(a,b,c,d)
}
// Array(Data(1,a,10,u), Data(2,b,20,v), Data(3,c,30,w))
Run Code Online (Sandbox Code Playgroud)
使用指数?
for (i <- 0 until Seq(s1,s2,s3,s4).map(_.length).min)
yield Data(s1(i), s2(i), s3(i), s4(i))
Run Code Online (Sandbox Code Playgroud)
这可以任意缩放,并以与zip/zipped(通过截断)相同的方式处理长度不匹配.