3

最后,我必须将一堆愚蠢的逗号分隔字符串变成对象。我首先将字符串拆分为数组。然后我需要同时迭代所有这些,并从四个值中构建一个对象。

val s1 = Array(1,2,3)
val s2 = Array("a","b","c")
val s3 = Array(10,20,30)
val s4 = Array("u","v","w")

目标对象如下所示:

case class Data(a: Int, b: String, c: Int, d: String)

第一个 Data 对象必须打印

Data(1,a,10,u)

等等。我找到了三个项目的解决方案:

(s1, s2, s3).zipped foreach { (v1, v2, v3) =>
  println(v1, v2, v3)
}

哪个打印:

(1,a,10)
(2,b,20)
(3,c,30)

使用四个或更多阵列,这将无法做到。Zipped 没有为 4 元组定义:

error: value zipped is not a member of (Array[Int], Array[String], Array[Int], Array[String])

我的 Scala 有点生锈,所以也许我错过了明显的东西(比如带有索引的迭代或其他东西)。

4

4 回答 4

9

它不漂亮,但应该可以工作(使用任意数量的行长度)

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))
于 2013-08-20T19:19:03.357 回答
5

使用索引?

for (i <- 0 until Seq(s1,s2,s3,s4).map(_.length).min)
yield Data(s1(i), s2(i), s3(i), s4(i))

这可以任意缩放,并以与 zip/zipped 相同的方式处理长度不匹配(通过截断)。

于 2013-08-21T04:57:08.900 回答
3

这应该这样做:

((s1, s2, s3).zipped, s4).zipped foreach { case ((v1, v2, v3), v4) =>
  println(v1, v2, v3, v4)
}
于 2013-08-20T19:18:15.270 回答
1

Similar to Marius Danila answer

val zipped = (s1 zip s2 zip s3 zip s4) map {
  case (((a, b), c), d) => Data(a, b, c, d)
}
于 2013-08-20T20:26:04.853 回答