範囲と進行
Kotlinでは、範囲と進行により値のシーケンスを定義でき、範囲演算子、イテレーション、カスタムステップ値、等差数列をサポートします。
範囲
Kotlinでは、kotlin.ranges
パッケージの.rangeTo()
と.rangeUntil()
関数を使って値の範囲を簡単に作成できます。
範囲は、開始と終了が定義された値の順序付けられたセットを表します。デフォルトでは、各ステップで1ずつ増えます。例えば、1..4
は1、2、3、4という数値を表します。
作成するには:
- 閉じた範囲を作成するには、
..
演算子で.rangeTo()
関数を呼び出します。これには開始値と終了値の両方が含まれます。 - 開いた範囲を作成するには、
..<
演算子で.rangeUntil()
関数を呼び出します。これには開始値は含まれますが、終了値は含まれません。
例:
fun main() {
// 閉じた範囲: 1と4の両方を含む
println(4 in 1..4)
// true
// 開いた範囲: 1を含み、4を含まない
println(4 in 1..<4)
// false
}
範囲は、for
ループでイテレーションを行う際に特に便利です:
fun main() {
for (i in 1..4) print(i)
// 1234
}
数値を逆順にイテレートするには、..
の代わりにdownTo
関数を使用します。
fun main() {
for (i in 4 downTo 1) print(i)
// 4321
}
デフォルトの1増分の代わりに、step()
関数を使ってカスタムステップで数値をイテレートすることもできます:
fun main() {
for (i in 0..8 step 2) print(i)
println()
// 02468
for (i in 0..<8 step 2) print(i)
println()
// 0246
for (i in 8 downTo 0 step 2) print(i)
// 86420
}
進行
Int
、Long
、Char
のような整数型の範囲は、等差数列として扱うことができます。Kotlinでは、これらの進行はIntProgression
、LongProgression
、CharProgression
といった特殊な型で定義されます。
進行には、first
要素、last
要素、0ではないstep
という3つの重要なプロパティがあります。最初の要素はfirst
で、後続の要素は前の要素にstep
を加えたものです。正のステップを持つ進行のイテレーションは、Java/JavaScriptにおけるインデックス付きfor
ループと同等です。
for (int i = first; i <= last; i += step) {
// ...
}
範囲をイテレートすることによって暗黙的に進行を作成する場合、この進行のfirst
要素とlast
要素は範囲の終点となり、step
は1になります。
fun main() {
for (i in 1..10) print(i)
// 12345678910
}
カスタム進行ステップを定義するには、範囲に対してstep
関数を使用します。
fun main() {
for (i in 1..8 step 2) print(i)
// 1357
}
進行のlast
要素は次のように計算されます:
- 正のステップの場合: 終了値を超えず、かつ
(last - first) % step == 0
となる最大値。 - 負のステップの場合: 終了値を下回らず、かつ
(last - first) % step == 0
となる最小値。
したがって、last
要素は指定された終了値と常に同じであるとは限りません。
fun main() {
for (i in 1..9 step 3) print(i) // 最後の要素は7です
// 147
}
進行はIterable<N>
を実装しており、ここでN
はそれぞれInt
、Long
、Char
であるため、map
、filter
などのさまざまなコレクション関数で使用できます。
fun main() {
println((1..10).filter { it % 2 == 0 })
// [2, 4, 6, 8, 10]
}