6
scala> val a = List(1,2)
a: List[Int] = List(1, 2)

scala> val b = List(3,4)
b: List[Int] = List(3, 4)

scala> val c = List(5,6)
c: List[Int] = List(5, 6)

scala> val d = List(7,8)
d: List[Int] = List(7, 8)

scala> (a,b,c).zipped.toList
res6: List[(Int, Int, Int)] = List((1,3,5), (2,4,6))

今:

scala> (a,b,c,d).zipped.toList
<console>:12: error: value zipped is not a member of (List[Int], List[Int], List[Int],     List[Int])
              (a,b,c,d).zipped.toList
                       ^

this onethis oneを含む他の場所でこれを検索しましたが、決定的な答えはありません。

次のようなことをしたい:

for((itemA,itemB,itemC,itemD) <- (something)) yield itemA + itemB + itemC + itemD

助言がありますか?

4

4 に答える 4

3

簡潔な答え:

for (List(w,x,y,z) <- List(a,b,c,d).transpose) yield (w,x,y,z)
  // List[(Int, Int, Int, Int)] = List((1,3,5,7), (2,4,6,8))

なぜそれらをタプルとして使用する必要があるのか​​はわかりませんが、もう少し興味深いケースは、リストが異なるタイプであり、たとえば、それらをオブジェクトのリストに結合したい場合です。

case class Person(name: String, age: Int, height: Double, weight: Double)
val names =   List("Alf", "Betty")
val ages =    List(22, 33)
val heights = List(111.1, 122.2)
val weights = List(70.1, 80.2)
val persons: List[Person] = ???

解決策 1:transpose上記のように を使用:

for { List(name: String, age: Int, height: Double, weight: Double) <- 
        List(names, ages, heights, weights).transpose
    } yield Person(name, age, height, weight)

ここでは、リスト エクストラクタに型注釈が必要transposeですList[List[Any]]

解決策 2: イテレータを使用する:

val namesIt   = names.iterator
val agesIt    = ages.iterator
val heightsIt = heights.iterator
val weightsIt = weights.iterator

for { name <- names } 
  yield Person(namesIt.next, agesIt.next, heightsIt.next, weightsIt.next)

一部の人々は、変更可能な状態を伴い、「機能的」ではないため、イテレータを避けるでしょう。しかし、Java の世界から来た人には理解しやすいものであり、実際にすでにイテレーター (入力ストリームなど) を持っている場合に適しているかもしれません。

于 2013-06-12T17:52:39.573 に答える
1

恥知らずなプラグイン -- product-collectionsは似たようなことをします:

 a flatZip b flatZip c flatZip d
 res0: org.catch22.collections.immutable.CollSeq4[Int,Int,Int,Int] = 
 CollSeq((1,3,5,7),
         (2,4,6,8))

 scala> res0(0) //first row
 res1: Product4[Int,Int,Int,Int] = (1,3,5,7)

 scala> res0._1 //first column
 res2: Seq[Int] = List(1, 2)
于 2013-06-13T17:23:21.960 に答える