1
假設我想要生成Set的子集的所有組合。由於subset
返回iterator
我不想將其轉換爲嚴格的東西。迭代器覆蓋for循環中的相同集合
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))
似乎只有第二個迭代器遍歷所有子集。爲什麼它的行爲如此並且有避免這種情況的好方法?
是啊,THX。缺陷在我的想法。我想避免將其轉換爲不可變的集合。 – Kigyo
但是現在我測試了它,我的算法(也有其他一些東西)比我用不可變集合的初始解決方案慢3倍。太糟糕了。只是想節省一些空間。 – Kigyo
@Kigyo:[子集的實現](https://github.com/scala/scala/blob/v2.10.3/src/library/scala/collection/SetLike.scala#L175)很貴,包括'N'調用昂貴的'toIndexedSeq'操作(1代表'len'從'0'到'Set#size')。 – senia