範囲(Range)と数列(Progression)
Kotlinはある範囲に渡る値を.rangeTo()
関数
と.rangeUntil()
関数で簡単に作る事が出来ます。
これらの関数はkotlin.ranges
パッケージにあります。
- 終端を含む範囲を作成するには、
..
演算子を使って.rangeTo()
関数を呼びます - 終端を含まない範囲を作成するには、
..<
演算子を使って.rangeUntil()
関数を呼びます
例を挙げましょう:
範囲はfor
ループでその上に渡ってイテレートしたい時に特に便利です:
数字を逆順にイテレートしたければ、..
の代わりにdownTo
関数を使います.
数字を1以外の間隔でイテレートする事も可能です。
それにはstep
関数を使います。
数列
(訳注:Progression)
整数の型、Int
、 Long
、 Char
の範囲は、等差数列として扱う事が出来ます。
Kotlinでは、これらの数列は特別な型として定義されます:IntProgression
、
LongProgression
、
CharProgression
です。
数列には3つの重要なプロパティがあります:
first
要素、last
要素、そして非ゼロのstep
です。
最初の要素はfirst
です。以後それに続く要素は前の要素にstep
を足したものです。
正のステップの数列をイテレートする事は、Java/JavaScriptのインデックスを使ったfor
ループと同等です。
for (int i = first; i <= last; i += step) {
// ...
}
範囲をイテレートする事で暗黙のうちに数列を作る場合、
その数列のfirst
とlast
は範囲の両終端で、step
は1となっています。
カスタムな差分による数列を定義したければ、step
関数を範囲に使います。
数列のlast
の要素は以下のように計算されます:
- 正のステップの時:以下を満たす中で終端を越えない最大の値
(last - first) % step == 0
- 負のステップの時:以下を満たす中で終端の値を下回らない最小の値
(last - first) % step == 0
つまり、last
要素は指定された値と必ずしも等しくはなりません。
数列はIterable<N>
を実装しています、ここでN
はそれぞれInt
、 Long
、Char
です。
だから、map
やfilter
などの様々なコレクションの関数で使う事が出来ます。