ObservableBuffer给斯卡拉IndexOutOfBounds

问题描述:

我很迷住。下面的代码给了我一个indexoutofbound错误。但是,如果我要删除启用for(j <- i until tmpArray.length)的斜杠,它将起作用。我真的不明白为什么会发生,并希望得到解释。ObservableBuffer给斯卡拉IndexOutOfBounds

for(i <- 0 until tmpArray.length) 
{ 
// for(j <- i until tmpArray.length) 
// { 
    if(date.getValue != null && tmpArray(i).date != date.getValue) 
    { 
     tmpArray.remove(i) 
    } 
// } 
} 
+0

你为什么不尝试'ArrayBuffer'而不是'ObservableBuffer'? –

您正在修改数组,因为您在其上“迭代”。

实际上,您正在迭代0 until tmpArray.length的范围,该范围在前面计算。在某个时候,你减少了数组的长度(或者,我认为是这样,因为我在Array类中找不到remove)。但是当你创建范围时,它仍然会继续迭代到最后一个索引。

当您取消对内部for块的注释时,您正在使其重新计算外部for的每个步骤的范围。如果i >= tmpArray.length发生的话,j范围内的任何内容都不会包含任何内容。所以它无意中防范了这种失败。

这是非常C式(命令式)的代码。它看起来像你想要做的是从数组中删除一些项目。这就是filter的用途。

val result = tmpArray.filter { d => 
    if(date.getValue != null && d != date.getValue) false else true 
} 

这将创建一个新的阵列(result)通过使一个匿名功能tmpArray.filter。它会将数组中的每个项目传递给“谓词”,如果返回true,它会将该项目保存在result中,否则它将忽略它。

你应该注意到我避免说“循环”。 Scala的for不适用于制作循环。它实际上是用于调用诸如foreachmap之类的方法的语法糖。谷歌“理解scala”了解更多细节。

如果您坚持使用索引和循环变量创建C风格的循环,则需要使用while,以便您可以检查每次是否为i < tmpArray.length

+1

谢谢!帮了很多。我习惯了C,我上个月从Scala开始。 –