for循环中相同集合的迭代器

时间:2013-12-23 07:12:23

标签: scala iterator

假设我想生成Set的子集的所有组合。由于subset返回iterator,我不想将其转换为严格的内容。

def gen(A: Set[Int]) = {
  val it0 = A.subsets
  val it1 = A.subsets
  for(a <- it0; b <- it1) yield (a,b)
}

但它不是我想要的。例如gen(Set(1,2,3)).foreach(println)返回:

(Set(),Set())
(Set(),Set(1))
(Set(),Set(2))
(Set(),Set(3))
(Set(),Set(1, 2))
(Set(),Set(1, 3))
(Set(),Set(2, 3))
(Set(),Set(1, 2, 3))

似乎只有第二个迭代器迭代所有子集。为什么它表现得那样,是否有一种很好的方法来避免这种情况?

1 个答案:

答案 0 :(得分:4)

请注意,it0it1Iterator。你不能使用这样的迭代器:

val it0 = Iterator(1, 2)
val it1 = Iterator(1, 2)

(for { a <- it0; b <- it1 } yield (a, b)).toList
// List[(Int, Int)] = List((1,1), (1,2))

这里的原因是你无法重复IteratorIterator是可变的。对于it0的第一个元素,您已经迭代it1,因此it1的{​​{1}}的下一个元素为空{/ 1}}。

您应该为第一个迭代器的每个元素重新创建第二个迭代器:

it0

或者将def gen(A: Set[Int]) = for{ a <- A.subsets b <- A.subsets } yield (a,b) 传递给不可变的集合:

Iterator