読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

for文を使った配列の操作

Scala

for文を使うと、配列やListの操作を簡単に行なうことができます。

配列を列挙する

単純に配列を列挙するには次のように書きます。

for ( <パターン名> <- <配列> ) <処理>

これで以下の処理が行なわれます。

  1. 配列の値を一つ取り出してパターン名が示す変数に代入
  2. 処理を実行。
  3. 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