for文を使った配列の操作
for文を使うと、配列やListの操作を簡単に行なうことができます。
配列を列挙する
単純に配列を列挙するには次のように書きます。
for ( <パターン名> <- <配列> ) <処理>
これで以下の処理が行なわれます。
- 配列の値を一つ取り出してパターン名が示す変数に代入
- 処理を実行。
- 1〜2を配列の要素すべてに対して行なう。
- (当たり前ですが)「<処理>」中では、パターン名で各要素にアクセスできます。
- 「<配列>」のところには、正確には「foreach()を実装したオブジェクトを返す任意の式」が指定できます。
- なので、ListやStringなどを指定することも可能です。
var array = Array(1,2,3,4,5) // 要素を列挙する。 for ( i <- array ) { println(i) }
実行結果です。
1 2 3 4 5
配列の要素のうち、条件にマッチする要素だけを列挙する
条件にマッチする要素だけを列挙したい場合、「ガード条件」を指定するのがスマート。
for ( <パターン名> <- <配列> if <ガード条件> ) <処理>
- 「<配列>」は、「filter()を実装したオブジェクトを返す式」である必要があります。ガード条件なしのforとは異なるので注意。
サンプル。
// 条件にマッチする要素を列挙する。 for ( i <- array if i%2 == 0 ) { println(i) }
実行結果です。
2 4
配列の各要素に特定の処理を施した配列を得る
yieldをつけると、forの実行結果として処理の結果を要素に持つ配列が返されます。これを利用して、配列の各要素に特定の処理を施した配列を得ることができます。yieldを書く場所は次の通り。
for ( <パターン名> <- <配列> ) yield <処理>
- 「<配列>」は、「map()を実装したオブジェクトを返す式」である必要があります。
- ガード条件と同時に使うことができます。
// 配列の各要素に特定の処理を施した配列を得る var array2 = for ( i <- array ) yield { i*2 } array2.foreach( i => println(i) ) // ガード条件と併用することも可能 array2 = for ( i <- array if i%2==0 ) yield { i*3 } array2.foreach( i => println(i) )
実行結果です。
2 4 6 8 10 6 12
複数の配列を列挙する
例えばrubyだと次のように書くところを、
array.each { |i| array2.each { |j| ...処理... } }
1つのfor文でやってしまえます。書き方は次の通り。「 <パターン名> <- <配列>」を「;」区切りで複数並べるだけ。
for ( <パターン名> <- <配列>; <パターン名2> <- <配列2> ) <処理>
- 「<配列>」のところは「foreach()を実装したオブジェクトを返す任意の式」であればOK。
- ガード条件やyieldを同時に使うことももちろん可能です。
// 複数の配列を列挙する array2 = Array(6,7) for ( i <- array; j <- array2 ) { println( i + "," + j ) } // yieldやガード条件の併用も可 var array3 = for ( i <- array if i%2==0; j <- array2 ) yield { i * j } array3.foreach( i => println(i) )
実行結果です。
1,6 1,7 2,6 2,7 3,6 3,7 4,6 4,7 5,6 5,7 12 14 24 28