为什么使用scala的迭代器实现crossProduct会返回错误的结果?

时间:2019-01-03 05:40:32

标签: scala iterator

在这里,我将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)

1 个答案:

答案 0 :(得分:4)

因为Iterator只能遍历一次,并且只能遍历一次。

left转到其下一个元素时,right必须从头开始。 Iterator无法做到这一点。一次遍历后为空。