假设我想生成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))
似乎只有第二个迭代器迭代所有子集。为什么它表现得那样,是否有一种很好的方法来避免这种情况?
答案 0 :(得分:4)
请注意,it0
和it1
为Iterator
。你不能使用这样的迭代器:
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))
这里的原因是你无法重复Iterator
,Iterator
是可变的。对于it0
的第一个元素,您已经迭代it1
,因此it1
的{{1}}的下一个元素为空{/ 1}}。
您应该为第一个迭代器的每个元素重新创建第二个迭代器:
it0
或者将def gen(A: Set[Int]) =
for{
a <- A.subsets
b <- A.subsets
} yield (a,b)
传递给不可变的集合:
Iterator