2012-10-31 29 views
4

什麼是在Scala中實現以下代碼的慣用方式?在Scala中實現帶條件的嵌套循環

for (int i = 1; i < 10; i+=2) { 
    // i = 1, 3, 5, 7, 9 
    bool intercept = false; 

    for (int j = 1; j < 10; j+=3) { 
    // j = 1, 4, 7 
    if (i==j) intercept = true 
    } 

    if (!intercept) { 
    System.out.println("no intercept") 
    } 
} 

回答

6

您可以使用Range,朋友們:

if (((1 until 10 by 2) intersect (1 until 10 by 3)).isEmpty) 
    System.out.println("no intercept") 

這不涉及一個嵌套循環(你指的稱號),但它是一個更慣用的方式來獲得在斯卡拉同樣的結果。

編輯:雷克斯克爾指出,上述版本不會每次打印的消息,但下列情況:

(1 until 10 by 2) filterNot (1 until 10 by 3 contains _) foreach (
    _ => println("no intercept") 
) 
+1

這與所提供的代碼示例有不同的行爲。如果你運行Java代碼,你會得到三次「無攔截」。 –

+0

思考設置它會是'(1到10乘2)'** minus **'(1到10乘3)'。這是通過filterNot實現的。 – pedrofurla

6

編輯:哎呦,你打印每個i。在這種情況下:

for (i <- 1 until 10 by 2) { 
    if (!(1 until 10 by 3).exists(_ == i)) println("no intercept") 
} 

在這種情況下,你實際上並不需要的條件,雖然:在contains方法會檢查你想在內環查了一下。

for (i <- 1 until 10 by 2) { 
    if (!(1 until 10 by 3).contains(i)) println("no intercept") 
}