2017-06-05 51 views
1

我很迷住。下面的代碼給了我一個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'? –

回答

3

您正在修改數組,因爲您在其上「迭代」。

實際上,您正在迭代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開始。 –