2012-10-31 2 views
4

스칼라에서 다음 코드를 구현하는 관용적 인 방법은 무엇입니까?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 코드를 실행하면'no intercept '가 세 번 인쇄됩니다. –

+0

세트로 생각하면'(1 ~ 10 x 2)'** 마이너스 **'(1 ~ 10 x 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") 
}