scala - 使用 4 个(或 N 个)集合一次只产生一个值(1xN)(即为 tuple4+ 压缩)

标签 scala collections tuples for-comprehension

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

有什么建议?

最佳答案

简短的回答:

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 世界,它们很容易理解,并且如果您实际拥有的已经是迭代器(输入流等),它们可能很合适。

关于scala - 使用 4 个(或 N 个)集合一次只产生一个值(1xN)(即为 tuple4+ 压缩),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17069484/

相关文章:

Scala pipelines - 用于构建 DAG 工作流程的 DSL

javascript - 使用 expressJS 将数据插入到 MongoDB

java - 将 java.lang.Boolean 转换为 Scala boolean 值

list - 当对象是动态的时,如何在 Scala 中对列表进行排序?

scala - 为什么向量这么浅?

java - HashSet.contains(object) 对于插入后修改的实例返回 false

Java HashMap<String,List<String>>() 比较

c++ - 递归地构建一个元组

python - 将字典键拆分为字符串类型的元组并将另一个字符串附加到元组中的最后一项的最快方法是什么?

c# - 为什么.NET Framework 4.0 中的静态类Tuple 可以有new 关键字来创建实例?