2012-12-22 20 views
8

我使用Scala的2.9.1,當我嘗試這種代碼:scala中的mutable.Set.foreach的錯誤?

import scala.collection.mutable 
val a = mutable.Set(1,2,3,4,7,0,98,9,8) 
a.foreach(x => { println(x); a.remove(x) }) 

結果是像

0 
98 
2 
1 
4 
3 
8 

其中沒有列出的所有元素。在此之後,a變成Set(9,7)而不是空集。它對我來說看起來很奇怪,是一個bug還是我們在做foreach時不能修改這個集合?

+4

爲什麼downvote?我認爲這對於新來的迭代者以及它們是如何工作的人來說是一個非常有效的問題 –

+4

我還沒有看到類似的東西,但是你可以用'a.flatMap(x => {println(x); if(cond )沒有其他Some(x)})'這將返回一個新的集合,刪除了None項。 – jcern

+0

它不僅是一個有效的問題,它重複http://stackoverflow.com/questions/2803085/iterators-for-mutable-collections-in-scala和http://stackoverflow.com/questions/4417994/scala-remove -in-place-all-elements-of-listbuffer-that-meet-a-condition和http://stackoverflow.com/questions/2500548/what-is-the-proper-way-to-remove-elements -from-a-scala-mutable-map-using-a-predi –

回答

10

在遍歷或迭代集合時,您不能修改集合。

這和Scala中的一樣,就像在Java(和大多數其他編程語言/庫)中一樣。除了在Java中,Iterator類提供了一個remove方法,可以使用該方法而不是集合的remove方法來刪除元素,同時使用Iterator進行迭代(但會使該集合中可能正在使用的任何其他迭代器無效)。 Scala迭代器不提供這樣的方法。

+0

「foreach」是「遍歷」而不是「迭代」。 –

+0

@RexKerr不夠公平。 – sepp2k

+0

@ sepp2k很好的評論,但它沒有說明爲什麼它輸出這樣一個奇怪的結果(爲什麼它給出了這個特定的結果) – xhudik