2012-12-22 10 views
8

Ich verwende scala 2.9.1, wenn ich diesen Code versuchen:Ein Bug von veränderbar.Set.foreach in scala?

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) }) 

das Ergebnis war so etwas wie

0 
98 
2 
1 
4 
3 
8 

, die nicht alle Elemente einer Liste haben. Danach wird a zu Set (9, 7) statt leerer Satz. Es sieht sehr seltsam für mich aus, ist es ein Fehler oder wir können das Set selbst nicht ändern, wenn wir foreach machen?

+4

Warum der Downvote? Ich denke, es ist eine sehr gültige Frage für jemanden, der Iteratoren neu ist und wie sie arbeiten. –

+4

Ich habe nichts dergleichen gesehen, aber Sie könnten ein ähnliches Ergebnis mit 'a.flatMap (x => {println (x); if (cond) None else Einige (x)}) 'die einen neuen Satz mit den' None' Elementen zurückgeben werden. – jcern

+0

Es ist nicht nur eine gültige Frage, es dupliziert http://StackOverflow.com/Questions/2803085/iterators-for-mutable-Collections-in-Scala und http://StackOverflow.com/Questions/4417994/ScalaRemove -in-place-all-elements-of-a-listpuffer-die-erfüllen-eine-bedingung und http://stackoverflow.com/questions/2500548/was-ist-die-automatische-weg-zu-entfernen-elemente -from-a-scala-veränderbar-map-using-a-predi –

Antwort

10

Sie dürfen eine Sammlung nicht ändern, während sie durchlaufen oder iteriert werden.

Dies ist das gleiche in Scala wie in Java (und den meisten anderen Programmiersprachen/Bibliotheken). Außer in Java bietet die Klasse Iterator eine remove-Methode, die anstelle der remove-Methode der Sammlung verwendet werden kann, um Elemente zu entfernen, während die Iterator iteriert wird (aber alle anderen Iteratoren dieser Sammlung ungültig werden, die möglicherweise verwendet werden). Scala-Iteratoren bieten keine solche Methode.

+0

'foreach' ist" durchqueren "nicht" iterieren ". –

+0

@RexKerr Fair genug. – sepp2k

+0

@ Sepp2k netter Kommentar, aber es sagte nicht nichts über Grund, warum es so ein seltsames Ergebnis ausgibt (warum gibt es dieses bestimmte Ergebnis) – xhudik