1. 序章

範囲は、開始、終了、およびステップによって定義される一連の値です。

このクイックチュートリアルでは、Kotlinで範囲を定義して使用する方法を見ていきます。

2. KotlinRangesの使用

Kotlinでは、 rangeTo()および downTo()関数または..を使用して範囲を作成できます。 オペレーター。

同等のタイプの範囲を使用できます。

デフォルトでは、これらは包括的です。は、1..4式が値1、2、3、および4に対応することを意味します。

さらに、には別のデフォルトがあります。ステップと呼ばれる2つの値の間の距離で、暗黙の値は1です。

それでは、範囲を作成し、他の便利な方法を使用して範囲を操作する例をいくつか見てみましょう。

2.1. 範囲の作成

範囲は、共通のインターフェース–ClosedRangeを実装します の結果 ClosedRange 進歩です (( そのような IntProgression、LongProgression、 また CharProgression)。

この進行には、開始、包括的終了、およびステップが含まれ、次のサブタイプです。 反復可能ここで、Nは Int、Long またチャー

「..」およびin演算子を使用して、範囲を作成する最も簡単な方法を確認することから始めましょう。

(i in 1..9)

また、後方範囲を定義する場合は、downTo演算子を使用できます。

(i in 9 downTo 1)

この式をifステートメントの一部として使用して、値が範囲に属しているかどうかを確認することもできます。

if (3 in 1..9)
  print("yes")

2.2. 反復範囲

これで、同等の範囲を使用できますが、反復する場合は、整数型の範囲が必要です。

次に、範囲を反復処理するコードを見てみましょう。

for (i in 1.rangeTo(9)) {
    print(i) // Print 123456789
}
  
for (i in 9.downTo(1)) {
    print(i) // Print 987654321
}

同じユースケースがcharsにも当てはまります。

for (ch in 'a'..'f') {
    print(ch) // Print abcdef
}
  
for (ch in 'f' downTo 'a') {
    print(ch) // Print fedcba
}

3. s tep()関数の使用

step()関数の使用はかなり直感的です。これを使用して、範囲の値間の距離を定義できます。

for(i in 1..9 step 2) {
    print(i) // Print 13579
}

for (i in 9 downTo 1 step 2) {
    print(i) // Print 97531
}

この例では、ステップ値2を使用して、1〜9の値を前後に繰り返しています。

4. reverse()関数の使用

名前が示すように、 reverse()関数は範囲の順序を逆にします。

(1..9).reversed().forEach {
    print(it) // Print 987654321
}

(1..9).reversed().step(3).forEach {
    print(it) // Print 963
}

5. until()関数の使用

終了要素を除外する範囲を作成する場合は、 until():を使用できます。

for (i in 1 until 9) {
    print(i) // Print 12345678
}

6. 最後、 最初、ステップ要素

範囲の最初、ステップ、または最後の値を見つける必要がある場合、それらを返す関数があります。

print((1..9).first) // Print 1
print((1..9 step 2).step) // Print 2
print((3..9).reversed().last) // Print 3

7. フィルタリング範囲

filter()関数は、指定された述語に一致する要素のリストを返します。

val r = 1..10
val f = r.filter { it -> it % 2 == 0 } // Print [2, 4, 6, 8, 10]

map() reduce()などの他の関数を次の範囲に適用することもできます。

val m = r.map { it -> it * it } // Print [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
val rdc = r.reduce{a, b -> a + b} // Print 55

8. その他のユーティリティ機能

min、max、sum、average、count、distinct など、範囲に適用できる関数は他にもたくさんあります。

val r = 1..20
print(r.min()) // Print 1
print(r.max()) // Print 20
print(r.sum()) // Print 210
print(r.average()) // Print 10.5
print(r.count()) // Print 20

val repeated = listOf(1, 1, 2, 4, 4, 6, 10)
print(repeated.distinct()) // Print [1, 2, 4, 6, 10]

9. カスタムオブジェクト

カスタムオブジェクト上に範囲を作成することも可能です。そのための唯一の要件は、Compareableインターフェイスを拡張することです。

列挙型は良い例です。 Kotlinのすべての列挙型はComparableを拡張します。これは、デフォルトでは、要素が表示される順序で並べ替えられることを意味します。

簡単なカラー列挙型を作成しましょう:

enum class Color(val rgb: Int) : Comparable<Color> {
    BLUE(0x0000FF),
    GREEN(0x008000),
    RED(0xFF0000),
    MAGENTA(0xFF00FF),
    YELLOW(0xFFFF00);
}

そして、それをいくつかのifステートメントで使用します。

val range = red..yellow
if (range.contains(Color.MAGENTA)) println("true") // Print true
if (Color.RED in Color.GREEN..Color.YELLOW) println("true") // Print true
if (Color.RED !in Color.MAGENTA..Color.YELLOW) println("true") // Print true

ただし、これは整数型ではないため、繰り返すことはできません。 試してみると、コンパイルエラーが発生します。

fun main(args: Array<String>) {
    for (c in Color.BLUE.rangeTo(Color.YELLOW)) println(c) // for-loop range must have an iterator() method
}

また、反復可能なカスタム範囲が必要な場合は、ClosedRangeIterator。を実装する必要があります。

10. 結論

この記事では、Kotlinで範囲式を使用する方法と、適用できるさまざまな関数について説明しました。

いつものように、ソースコードはGitHubから入手できます。