2017-06-05 8 views
1

私は魅了されています。以下のコードは私にindexoutofboundエラーを与えています。しかし、スラッシュを削除してfor(j <- i until tmpArray.length)を有効にすればうまくいくはずです。私は本当にそれが起こっている理由を理解していないし、説明を感謝します。ObservableBufferはScalaで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

なぜObservableBuffer'の代わりに 'ArrayBuffer'を試してみませんか? –

答えて

3

"反復"するときに配列を変更しています。

実際には、計算された範囲0 until tmpArray.lengthを反復しています。ある時点で、配列の長さを短くする(または、クラスでremoveが見つからないと仮定します)。しかし、それはあなたが範囲を作成したときに最後のインデックスが何であっても、繰り返しを続けます。

ブロックforブロックのコメントを外すときは、外側の各ステップの範囲を再計算します。forそして、の範囲には、i >= tmpArray.lengthの場合は、何も表示されません。だからそれは間違ってその失敗を警戒する。

これはCスタイル(必須)のコードです。配列からいくつかの項目を削除するだけです。それはfilterのためです。

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

これはtmpArray.filterに匿名関数を渡すことによって、新しいアレイ(result)を作成します。配列の各項目を "述語"に渡します。trueを返すと、その項目はresultに保持されます。それ以外の場合は、その項目は省略されます。

「ループ」とは言わないことに注意してください。 Scalaのforはループを作るためのものではありません。実際には、foreachmapのようなメソッドを呼び出すためのシンタックスシュガーです。詳細はGoogleの「理解のためのスカラー」を参照してください。

インデックスとループ変数を使用してCスタイルのループを作成することをお勧めする場合は、whileを使用して、毎回i < tmpArray.lengthかどうかを確認できます。

+1

ありがとうございます!たくさん助けてくれました。私はCに慣れています。先月Scalaから始めました。 –

関連する問題