3

コンマで区切られたばかげた一連の文字列を、最終的にはオブジェクトに変換する必要があります。最初に文字列を配列に分割します。次に、それらすべてを同時に反復処理し、4 つの値からオブジェクトを構築する必要があります。

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)

等々。次の 3 つの項目の解決策を見つけました。

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

どちらが印刷されますか:

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

4 つ以上の配列では、これではうまくいきません。Ziped は 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 に答える
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

マリウス・ダニラの回答に似ています

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 に答える