Scala mutable.LinkedHashMap:for 循环移除奇怪的行为
Scala mutable.LinkedHashMap: for-loop remove strange behavior
我有一个 mutable.LinkedHashMap 并尝试在 for 循环中删除项目。但是,如果发生删除,for 循环也会停止。
scala> val a = mutable.LinkedHashMap[Int, Int](1->1, 2->2, 3->3)
# when no remove occurs, for-loop works as expected
scala> for( (k,v) <- a ) { println(k); }
1
2
3
# following code doesn't work, only remove 1 and stop
scala> for( (k,v) <- a ) { println(k); a.remove(k) }
1
# following code work as expected
scala> a.keys.foreach{ k => println(k); a.remove(k) }
1
2
3
我很好奇为什么要删除 stop for-loop。
"remove on iteration" 在“2.13.0-M5”中工作正常,但在早期版本中不工作。但还是不建议砍掉你所在的树枝
见2.13例子: https://scastie.scala-lang.org/prayagupd/Cq2wUKP3TtmaL5IDMVKRfw/7
import scala.collection.mutable
val data = mutable.LinkedHashMap[Int, Int](1 -> 1, 2 -> 2, 3 -> 3)
println("before: " + data)
for ((k, v) <- data) {
println("removing key: " + k + " from map " + data)
data.remove(k)
}
println("after: " + data)
输出:
before: LinkedHashMap(1 -> 1, 2 -> 2, 3 -> 3)
removing key: 1 from map LinkedHashMap(1 -> 1, 2 -> 2, 3 -> 3)
removing key: 2 from map LinkedHashMap(2 -> 2, 3 -> 3)
removing key: 3 from map LinkedHashMap(3 -> 3)
after: LinkedHashMap()
我有一个 mutable.LinkedHashMap 并尝试在 for 循环中删除项目。但是,如果发生删除,for 循环也会停止。
scala> val a = mutable.LinkedHashMap[Int, Int](1->1, 2->2, 3->3)
# when no remove occurs, for-loop works as expected
scala> for( (k,v) <- a ) { println(k); }
1
2
3
# following code doesn't work, only remove 1 and stop
scala> for( (k,v) <- a ) { println(k); a.remove(k) }
1
# following code work as expected
scala> a.keys.foreach{ k => println(k); a.remove(k) }
1
2
3
我很好奇为什么要删除 stop for-loop。
"remove on iteration" 在“2.13.0-M5”中工作正常,但在早期版本中不工作。但还是不建议砍掉你所在的树枝
见2.13例子: https://scastie.scala-lang.org/prayagupd/Cq2wUKP3TtmaL5IDMVKRfw/7
import scala.collection.mutable
val data = mutable.LinkedHashMap[Int, Int](1 -> 1, 2 -> 2, 3 -> 3)
println("before: " + data)
for ((k, v) <- data) {
println("removing key: " + k + " from map " + data)
data.remove(k)
}
println("after: " + data)
输出:
before: LinkedHashMap(1 -> 1, 2 -> 2, 3 -> 3)
removing key: 1 from map LinkedHashMap(1 -> 1, 2 -> 2, 3 -> 3)
removing key: 2 from map LinkedHashMap(2 -> 2, 3 -> 3)
removing key: 3 from map LinkedHashMap(3 -> 3)
after: LinkedHashMap()