迭代ArrayBuffer时出现奇怪的行为

时间:2014-08-09 14:55:39

标签: scala foreach arraybuffer

我有两个ArrayBuffers,第一个(A)是另一个的子集,只包含长ID。第二个(B)包含案例类g的对象,其中ID为属性。现在,我想循环遍历A,以便删除B中与相应ID匹配的所有对象以及A中的ID。我使用以下方法

def removeID (ID:Long) {
  B.find(_.ID == ID) match {
    case Some(s) => 
      B.remove(B.indexWhere(_.ID == ID))
      A -= ID

   case None => sys.error("Cannot remove ID $ID")
}

}

我有点困惑,因为我现在得到的错误是:

java.lang.RuntimeException: Cannot remove ID 0

这是没有意义的,因为AB中没有0。我试图弄清楚在循环过程中究竟发生了什么

for(ID <- A) {removeID(ID)}

只对每个第2个元素应用removeID方法,直到它到达A的末尾,然后尝试查找不存在的ID 0

有人知道这种行为来自哪里吗?

编辑:所以问题不在于移除ID(它应该是这样),而是在ArrayBuffer上的迭代,这是没有意义的。

1 个答案:

答案 0 :(得分:0)

您可能会收到该错误,因为没有ID 0.因此case None部分会被执行。 但我建议你改用过滤器。

def removeID(ID: Long) {
  B = B.filterNot(_.ID == ID)
  A -= ID
}