ObservableBuffer在Scala中给出IndexOutOfBounds

时间:2017-06-05 16:52:11

标签: scala buffer

我很迷惑。下面的代码给我一个indexoutofbound错误。但是,如果我要删除启用$result = mysql_query("SELECT background FROM " . $shadowless_background_table . " WHERE id = 1"); if (mysql_num_rows($result)>0){ $fetchedColum = mysql_result($result, 0, 'COLUMN_NAME'); } 的斜杠,它将起作用。我真的不明白为什么会发生这种情况,并希望得到解释。

for(j <- i until tmpArray.length)

1 个答案:

答案 0 :(得分:3)

当您“迭代”它时,您正在修改数组。

您实际上是在预先计算的0 until tmpArray.length范围内进行迭代。在某些时候,你减少了数组的长度(或者,我假设,因为我在remove类上找不到Array。但是,当你创建范围时,它仍然会继续迭代到最后一个索引。

当您取消注释内部for块时,您将重新计算外部for的每个步骤的范围。恰好如果ji >= tmpArray.length范围内的任何内容都没有任何内容。所以它无意中防止了这种失败。

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

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

通过将匿名函数传递给result,可以创建 new 数组(tmpArray.filter)。它会将数组中的每个项目传递给您的“谓词”,如果它返回true,它会将该项目保留在result中,否则会省略它。

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

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