範囲(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などの様々なコレクションの関数で使う事が出来ます。