首页 > 解决方案 > 为什么用 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)

标签: scalaiterator

解决方案


因为 an只能Iterator遍历一次。

left进入下一个元素时,right必须从头开始。一个Iterator不能那样做。单次遍历后它是空的。


推荐阅读