Skip to content

範囲と進行

Kotlinにおける範囲(Range)と進行(Progression)は、値のシーケンスを定義します。これらは範囲演算子、イテレーション(反復処理)、カスタムステップ値、および等差数列をサポートしています。

範囲(Range)

Kotlinでは、kotlin.rangesパッケージの.rangeTo()関数および.rangeUntil()関数を使用して、値の範囲を簡単に作成できます。

範囲は、定義された開始点と終了点を持つ値の順序集合を表します。デフォルトでは、各ステップで1ずつ増加します。 例えば、1..4は数値の1、2、3、4を表します。

作成方法:

  • 閉じた範囲(closed-ended range)を作成するには、..演算子で.rangeTo()関数を呼び出します。これには開始値と終了値の両方が含まれます。
  • 半開範囲(open-ended range)を作成するには、..<演算子で.rangeUntil()関数を呼び出します。これには開始値が含まれますが、終了値は除外されます。

例えば:

kotlin
fun main() {
    // 閉じた範囲:1と4の両方を含む
    println(4 in 1..4)
    // true
    
    // 半開範囲:1を含み、4を除外する
    println(4 in 1..<4)
    // false
}

範囲は、特にforループでのイテレーションに便利です。

kotlin
fun main() {
    for (i in 1..4) print(i)
    // 1234
}

数値を逆順でイテレートするには、..の代わりにdownTo関数を使用します。

kotlin
fun main() {
    for (i in 4 downTo 1) print(i)
    // 4321
}

また、デフォルトの増分である1の代わりに、step()関数を使用して、カスタムステップで数値をイテレートすることもできます。

kotlin
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
}

進行(Progression)

IntLongCharなどの整数型の範囲は、等差数列(arithmetic progressions)として扱うことができます。 Kotlinでは、これらの進行は特別な型、すなわちIntProgressionLongProgression、およびCharProgressionによって定義されます。

進行には、first(最初の要素)、last(最後の要素)、およびゼロ以外のstep(ステップ)という3つの不可欠なプロパティがあります。 最初の要素はfirstで、それ以降の要素は前の要素にstepを加えたものになります。 正のステップを持つ進行のイテレーションは、Java/JavaScriptにおけるインデックス付きのforループと同等です。

java
for (int i = first; i <= last; i += step) {
  // ...
}

範囲をイテレートすることによって暗黙的に進行を作成する場合、その進行のfirstおよびlast要素は範囲の終点となり、stepは1になります。

kotlin
fun main() {
    for (i in 1..10) print(i)
    // 12345678910
}

カスタムの進行ステップを定義するには、範囲に対してstep関数を使用します。

kotlin

fun main() {
    for (i in 1..8 step 2) print(i)
    // 1357
}

進行のlast要素は次のように計算されます:

  • 正のステップの場合:(last - first) % step == 0を満たし、かつ終了値を超えない最大の値。
  • 負のステップの場合:(last - first) % step == 0を満たし、かつ終了値を下回らない最小の値。

したがって、last要素は必ずしも指定された終了値と同じになるとは限りません。

kotlin

fun main() {
    for (i in 1..9 step 3) print(i) // 最後の要素は7
    // 147
}

進行はIterable<N>NはそれぞれIntLong、またはChar)を実装しているため、mapfilterなどのさまざまなコレクション関数で使用できます。

kotlin

fun main() {
    println((1..10).filter { it % 2 == 0 })
    // [2, 4, 6, 8, 10]
}