scala - 为什么用 scala 的迭代器实现 crossProduct 会返回不正确的结果?
问题描述
在这里,我将定义crossProduct
为一个函数,该函数应返回左侧列表中所有可能的项目对与右侧列表中的项目的元组。
object CrossProduct {
def crossProduct[A, B](left: TraversableOnce[A], right: TraversableOnce[B]): TraversableOnce[(A, B)] = {
for {
l <- left
r <- right
} yield (l, r)
}
def main(args: Array[String]): Unit = {
val left = Vector("A", "B", "C")
val right = Vector("1", "2", "3", "4")
println("With Vector, Vector")
crossProduct(left, right).foreach(println)
println("With Iterator, Vector")
crossProduct(left.toIterator, right).foreach(println)
println("With Vector, Iterator")
crossProduct(left, right.toIterator).foreach(println)
println("With Iterator, Iterator")
crossProduct(left.toIterator, right.toIterator).foreach(println)
}
}
当我传入一个向量作为right
参数时,它会返回正确的结果。当我传入一个迭代器作为right
参数时,它无法迭代到left
参数的第二个元素。为什么会这样?
With Vector, Vector
(A,1)
(A,2)
(A,3)
(A,4)
(B,1)
(B,2)
(B,3)
(B,4)
(C,1)
(C,2)
(C,3)
(C,4)
With Iterator, Vector
(A,1)
(A,2)
(A,3)
(A,4)
(B,1)
(B,2)
(B,3)
(B,4)
(C,1)
(C,2)
(C,3)
(C,4)
With Vector, Iterator
(A,1)
(A,2)
(A,3)
(A,4)
With Iterator, Iterator
(A,1)
(A,2)
(A,3)
(A,4)
解决方案
因为 an只能Iterator
遍历一次。
当left
进入下一个元素时,right
必须从头开始。一个Iterator
不能那样做。单次遍历后它是空的。
推荐阅读
- python-3.x - 如何重新排序字典中的键?
- flutter - 扑。创建列表
firestore 文档和集合 - c# - C# SSH Text, number Send?
- opengl - 纹理翻转行为
- r - 使用 dplyr::distinct() 时保留最后一次出现,而不是第一次出现(此处不能使用arrange())
- python - 如何使用数据生成器通过数据框列中的路径加载图像以进行双重输入
- r - 如何使用ggplot2在直线和倒置geom_density()之间添加垂直空格
- ios - 在从初始化程序返回之前,不会在所有路径上调用“self.init”
- kotlin - 在 Kotlin 中选择并显示日期
- ios - 快速视频流启动