gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:23:47 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com