2017-09-01 17 views
0

Scalaでは、ネストされたforループを持っていて、それぞれに異なるものを実行したい場合はどうなりますか?外部forループのみをスカラーで実行する方法は?

for (int i = 0; i<5; i++) { 
    System.out.println(i);  //do something for just i 
    for(int j = 0; j<5; j++) { 
     System.out.println(i+j); //do something for both i and j 
    } 
} 

しかし、Scalaのコード:

for {i<-0 to 5 
    j<- 0 to 5} yield { print(i); print(i+j)} 

は出力が得られます。

0 
(0,0) 
0 
(0,1) 
0 
(0,2) 
0 
(0,3) 
0 
(0,4) 
0 
(0,5) 

が、私はそれになりたい:

0 
(0,0) 
(0,1) 
(0,2) 
(0,3) 
(0,4) 
(0,5) 

唯一の方法はあります各iを印刷します。iおよびi+jiおよびjループの1つはです。

+0

'場合(J == 0)印刷、次のようmap機能を使用することです(I ); print(i + j); '..非常にきれいではなく、副作用として。なぜネストされたループではないのですか?範囲に対して "x < - a〜b"の構文を使用することはできます。 – user2864740

+0

これは私の問題の抽象表現です。基本的には、私は2つのことを繰り返すことを望みます。外側のループで何かを行い、内側のループで何かを実行してください。@ user2864740 – rileyss

+2

ただ2つのfor-loopsを使用してください。また、for {...} {...} 'はfor-loopです。 '{...} yield {...} 'はfor-comprehensionです。彼らは非常に異なるものです。 –

答えて

1

代替方法は

val loop = 0 to 5 
loop.map(i => { 
    println(i) // do your stuffs as you did for i 
    loop.map(j => { 
    println(i, j) //do your stuffs as you did for i, j 
    }) 
}) 
3

コンパイラは、forそれらの構成map()に内包、flatMap()foreach()、及びwithFilter()部分を書き換えます。そのため、Scala構文の通常の規則のうちのいくつかは、シーケンス内包表記の中には適用されません。彼らは書き直しの過程で混乱します。

問題を回避するにはいくつかの方法があります。

for { 
    i <- 0 to 5 
    _ = println(i) 
    j <- 0 to 5 
} yield // do stuff with i and j 

これは実際にはiの値に関係します。 forの理解度が仕事に最適なツールではない可能性があります。

+0

OPの場合のように副作用がある場合は、 'yield'を削除する方が良いでしょう。 –

+0

@ user2864740;私は、「通常のルールのうちの何か」は適用されないと書いています。ここに2つの例があります:1) 'println()'ステートメントを置くことはできません。 2)は、通常の方法で変数を作成することはできません。 (例えば、「val x = 5」はコンパイルされませんが、「x = 5」はそうです)OPのコードは実行されないと言っているわけではありません。それはうまく動作します。しかし、2つの発電機の間にコードを入れて、OPがやろうとしていることは、せいぜいやりにくく、めったに勧められません。 – jwvh

1

私は、これはトリックを行うだろうと思います。同じをすることの

(0 to 5).zip(0 to 5).foreach{case (i, j) => 
    //do stuff to i an dj 
} 
+0

これは、 "stuff"が 'print(i) 'であれば、元の" problem "と同じです。 print(i + j) '。 – user2864740

関連する問題