【问题标题】:Scala mutable.LinkedHashMap: for-loop remove strange behaviorScala mutable.LinkedHashMap:for-loop 移除奇怪的行为
【发布时间】:2019-09-02 18:09:44
【问题描述】:

我有一个 mutable.LinkedHashMap 并尝试在 for 循环中删除项目。但是,如果发生 remove,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。

【问题讨论】:

  • 在迭代时更新集合会使迭代器失效。在最后一种情况下,您正在迭代 a.keys 返回的集合,以便按预期工作。

标签: scala linkedhashmap


【解决方案1】:

“在迭代中删除”在“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()

【讨论】:

    猜你喜欢
    • 2013-04-16
    • 1970-01-01
    • 2023-03-31
    • 2011-05-09
    • 1970-01-01
    • 2013-08-05
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多