2016-09-10 5 views
0

この動作はわかりません。値がグリッド(配列)上に作成されたサークル内にあるかどうかをチェックしたいと思います。円の2辺を定義します。スカラの反復子の値とvalのキャッシュされた値

val circleLeft = Vector(5,14,23..) 
val circleRight = Vector(5,16,27,..) 

私は以下の機能をこの状態でチェックしています。 最初のもの:

def insideCircle(idx: Int): Boolean = { 
    val l = circleLeft.toIterator 
    val r = circleRight.toIterator 
    while (l.hasNext && r.hasNext) { 
    if(idx < r.next && idx > l.next) return true 
    } 
    return false 
} 

常にtrueを返します。この第二の1

def insideCircle(idx: Int): Boolean = { 
    val l = circleLeft.toIterator 
    val r = circleRight.toIterator 
    while (l.hasNext && r.hasNext) { 
    val x1 = r.next 
    val x2 = l.next 
    println(x2,x1) 
    if(idx < x1 && idx > x2) return true 
    } 
    return false 
} 

では正常に動作、すなわちinsideCircle(15)、真= insideCircle(17)何かが、ここでは異なるあり

偽= ..?

答えて

4

&&と呼ばれています(Scalaでは、by-name引数で実装されています)。あなたの最初の例ではidx < r.nextの場合にのみl.nextが実行されます。第2の例では、常にl.nextが実行されます。

UPDATE

私はより多くの機能的な方法をお勧めします:

def insideCircle(idx: Int): Boolean = { 
    val l = circleLeft.toIterator 
    val r = circleRight.toIterator 
    r.zip(l).find { 
    case (x1, x2) => 
     idx < x1 && idx > x2 
    } 
    .isDefined 
} 
+0

ので、それAND条件私は、括弧の間に2つの条件を閉じる必要があります作るために?編集: 美しい、ありがとう! – LowFieldTheory

+0

私はあなたの質問を理解していない、 '&&'を呼び出す前に '.next'sの両方を評価する必要があります。 '{println(" left "); false} && {println( "right"); true} 'と' {println( "left"); false}&{println( "right"); true& ''( '&'は短絡法ではありません) –

+0

"&&を呼び出す前に両方の.nextsを評価する必要があります。 – LowFieldTheory

関連する問題