Почему реализация crossProduct с итераторами scala возвращает неверный результат? - PullRequest
0 голосов
/ 03 января 2019

Здесь я определяю 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 голосов
/ 03 января 2019

Поскольку Iterator можно пройти один раз, а - только один раз .

Когда left переходит к следующему элементу, right должен начинаться сначала.Iterator не может этого сделать.После одного обхода он пуст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...