Skip to content

レンジとプログレッション

Kotlinのレンジとプログレッションは値のシーケンスを定義し、範囲演算子、イテレーション、カスタムのステップ値、等差数列をサポートします。

レンジ

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

レンジは、定義された開始値と終了値を持つ順序付けられた値のセットを表します。デフォルトでは、各ステップで1ずつ増分します。例えば、1..4 は数値の1、2、3、4を表します。

作成するには:

  • 閉区間レンジを作成するには、.. 演算子を使用して .rangeTo() 関数を呼び出します。これは開始値と終了値の両方を含みます。
  • 開区間レンジを作成するには、..< 演算子を使用して .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
}

プログレッション

IntLongCharなどの整数型(integral types)のレンジは、等差数列(arithmetic progressions)として扱えます。Kotlinでは、これらのプログレッションは特別な型によって定義されます:IntProgressionLongProgression、および CharProgression

プログレッションには3つの重要なプロパティがあります:first 要素、last 要素、そしてゼロではない step です。最初の要素は 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 はそれぞれ IntLongChar です。そのため、mapfilter などの様々なコレクション関数で使用できます。

kotlin

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