Kotlinのforループ完全ガイド:基本構文から応用例まで解説

Kotlinのforループは、シンプルかつ強力な制御構文であり、リストや範囲(Range)などを効率的に反復処理するために使用されます。Javaや他のプログラミング言語に慣れている方にも直感的に理解できる一方、Kotlin独自の機能によって、より簡潔に記述できるのが特徴です。

本記事では、Kotlinにおけるforループの基本構文から始め、範囲を使ったループ、コレクション操作、インデックスの利用、ネストされたループ、breakやcontinueの活用法まで、幅広く解説します。実践的なコード例を交えながら、forループを効果的に使いこなすための知識を身につけましょう。

目次

Kotlinのforループの基本構文

Kotlinのforループは、シンプルで直感的な構文で反復処理を行います。一般的なforループの構文は以下の通りです。

基本構文

for (item in collection) {
    // 各要素に対する処理
}
  • item:コレクションの要素が順番に代入される変数
  • collection:ループで処理するリストや配列、範囲などのデータ集合

例:配列をループする

val fruits = arrayOf("Apple", "Banana", "Cherry")

for (fruit in fruits) {
    println(fruit)
}

出力結果:

Apple  
Banana  
Cherry  

例:範囲をループする

for (i in 1..5) {
    println(i)
}

出力結果:

1  
2  
3  
4  
5  

Kotlinのforループは、明確で簡潔に記述できるため、コードの可読性が向上します。次のセクションでは、範囲(Range)を使ったループの詳細を見ていきましょう。

範囲(Range)を使ったループ

Kotlinでは、範囲(Range)を使って数値や文字のシーケンスを反復処理できます。範囲を活用することで、簡潔にループを記述できます。

範囲の基本構文

for (i in start..end) {
    // 処理
}
  • start:範囲の開始値
  • end:範囲の終了値(含まれる)

数値の範囲を使ったループ

for (i in 1..5) {
    println(i)
}

出力結果:

1  
2  
3  
4  
5  

downToを使った降順のループ

降順でループしたい場合は、downToを使用します。

for (i in 5 downTo 1) {
    println(i)
}

出力結果:

5  
4  
3  
2  
1  

untilを使った範囲

untilを使うと、終了値を含めない範囲を指定できます。

for (i in 1 until 5) {
    println(i)
}

出力結果:

1  
2  
3  
4  

文字の範囲を使ったループ

文字の範囲も同様に扱えます。

for (ch in 'a'..'d') {
    println(ch)
}

出力結果:

a  
b  
c  
d  

範囲を使うことで、Kotlinのforループを柔軟かつ効率的に記述できます。次は、コレクションを使ったループについて解説します。

コレクションを用いたループ

Kotlinのforループは、配列やリスト、マップなどのコレクションを反復処理する際にも非常に便利です。コレクションを用いたループを理解することで、データの処理が効率的に行えます。

リストをループする

リストの各要素をループするには、以下のように記述します。

val fruits = listOf("Apple", "Banana", "Cherry")

for (fruit in fruits) {
    println(fruit)
}

出力結果:

Apple  
Banana  
Cherry  

配列をループする

配列の場合も、リストと同様にループできます。

val numbers = arrayOf(1, 2, 3, 4, 5)

for (number in numbers) {
    println(number)
}

出力結果:

1  
2  
3  
4  
5  

マップをループする

マップ(辞書)では、キーと値のペアをループすることができます。

val capitals = mapOf("Japan" to "Tokyo", "France" to "Paris", "USA" to "Washington D.C.")

for ((country, capital) in capitals) {
    println("$country の首都は $capital です")
}

出力結果:

Japan の首都は Tokyo です  
France の首都は Paris です  
USA の首都は Washington D.C. です  

インデックス付きでループする

withIndex()を使うと、インデックス付きでループできます。

val colors = listOf("Red", "Green", "Blue")

for ((index, color) in colors.withIndex()) {
    println("$index: $color")
}

出力結果:

0: Red  
1: Green  
2: Blue  

コレクションを使ったforループは、データの反復処理を効率化し、コードをシンプルに保つことができます。次は、インデックス付きループの詳細について解説します。

インデックス付きループ

Kotlinでは、ループで反復処理をする際にインデックスを利用したい場合、withIndex()indicesを活用できます。これにより、要素とそのインデックスを同時に処理できます。

withIndex()を使ったインデックス付きループ

withIndex()を使うと、インデックスと要素を取得しながらループが可能です。

val fruits = listOf("Apple", "Banana", "Cherry")

for ((index, fruit) in fruits.withIndex()) {
    println("Index $index: $fruit")
}

出力結果:

Index 0: Apple  
Index 1: Banana  
Index 2: Cherry  

indicesを使ったインデックスループ

indicesプロパティを使うと、リストや配列のインデックス範囲を取得できます。

val colors = arrayOf("Red", "Green", "Blue")

for (i in colors.indices) {
    println("Index $i: ${colors[i]}")
}

出力結果:

Index 0: Red  
Index 1: Green  
Index 2: Blue  

インデックスと要素を同時に扱う

インデックスと要素を別々に取得する場合は、以下のように記述します。

val animals = listOf("Dog", "Cat", "Bird")

for (i in 0 until animals.size) {
    println("Animal at $i: ${animals[i]}")
}

出力結果:

Animal at 0: Dog  
Animal at 1: Cat  
Animal at 2: Bird  

インデックスを使う場面

インデックスを使うことで、次のような処理が可能になります。

  • 要素の置き換え
  • 奇数・偶数インデックスの要素の処理
  • 隣接する要素の比較

例:偶数インデックスの要素だけ処理する

val numbers = listOf(10, 20, 30, 40, 50)

for (i in numbers.indices step 2) {
    println("Even index $i: ${numbers[i]}")
}

出力結果:

Even index 0: 10  
Even index 2: 30  
Even index 4: 50  

インデックス付きループを活用することで、Kotlinのforループがさらに柔軟になります。次は、ステップ指定や逆順ループについて解説します。

ステップ指定と逆順ループ

Kotlinのforループでは、ステップ数を指定したり、降順(逆順)で反復処理することが簡単にできます。これにより、柔軟で効率的なループ処理が可能です。

ステップ指定の基本構文

ステップ数を指定するには、stepキーワードを使います。

for (i in 1..10 step 2) {
    println(i)
}

出力結果:

1  
3  
5  
7  
9  
  • step 2:2つ飛ばしでループを進めます。

降順ループの基本構文

降順(逆順)でループするには、downToを使います。

for (i in 5 downTo 1) {
    println(i)
}

出力結果:

5  
4  
3  
2  
1  

降順ループでステップ指定

降順ループでもステップ数を指定できます。

for (i in 10 downTo 1 step 3) {
    println(i)
}

出力結果:

10  
7  
4  
1  

ステップと降順の応用例

偶数だけを逆順に表示

for (i in 10 downTo 2 step 2) {
    println(i)
}

出力結果:

10  
8  
6  
4  
2  

注意点

  • ステップ数は必ず正の値で指定します。降順の場合でも、stepは正の整数です。
  • ループの終了値がステップに合わない場合、終了値はスキップされます。

まとめ

ステップ指定や降順ループを活用することで、特定のパターンに従った反復処理が可能になります。次は、ネストされたforループについて解説します。

ネストされたforループ

Kotlinでは、forループを他のforループの中に入れることで、ネストされたループ(多重ループ)を作成できます。これにより、2次元データや複雑なパターンの反復処理が可能です。

基本構文

ネストされたforループの基本的な構文は以下の通りです。

for (i in 1..3) {
    for (j in 1..2) {
        println("i: $i, j: $j")
    }
}

出力結果:

i: 1, j: 1  
i: 1, j: 2  
i: 2, j: 1  
i: 2, j: 2  
i: 3, j: 1  
i: 3, j: 2  

2次元配列のループ

2次元配列やリストを反復処理する際に、ネストされたforループがよく使われます。

val matrix = arrayOf(
    arrayOf(1, 2, 3),
    arrayOf(4, 5, 6),
    arrayOf(7, 8, 9)
)

for (row in matrix) {
    for (element in row) {
        print("$element ")
    }
    println()
}

出力結果:

1 2 3  
4 5 6  
7 8 9  

ネストされたループの応用例

かけ算の九九表

for (i in 1..9) {
    for (j in 1..9) {
        print("${i * j}\t")
    }
    println()
}

出力結果:

1    2   3   4   5   6   7   8   9   
2    4   6   8   10  12  14  16  18  
3    6   9   12  15  18  21  24  27  
4    8   12  16  20  24  28  32  36  
5    10  15  20  25  30  35  40  45  
6    12  18  24  30  36  42  48  54  
7    14  21  28  35  42  49  56  63  
8    16  24  32  40  48  56  64  72  
9    18  27  36  45  54  63  72  81  

ネストされたループの注意点

  • パフォーマンス:ループの深さが増えると処理時間が増大するため、大量のデータ処理では注意が必要です。
  • 可読性:深いネストはコードの可読性を低下させるため、適切にコメントを付ける、関数に分割するなどの工夫が必要です。

ネストされたforループを活用することで、複雑なデータ処理が可能になります。次は、breakとcontinueによるループ制御について解説します。

breakとcontinueによる制御

Kotlinのforループでは、breakcontinueを使ってループの流れを制御できます。これにより、特定の条件でループを終了したり、処理をスキップしたりすることが可能です。


break:ループの終了

breakを使うと、ループの処理を強制的に終了します。条件に一致した時点でループを抜け出したい場合に使用します。

例:特定の条件でループを終了する

for (i in 1..5) {
    if (i == 3) {
        println("ループを終了します")
        break
    }
    println(i)
}

出力結果:

1  
2  
ループを終了します  

説明iが3になった時点でbreakが実行され、ループが終了します。


continue:次の反復に進む

continueを使うと、現在の反復処理をスキップして次の反復に進みます。特定の条件で処理を飛ばしたい場合に使用します。

例:特定の値をスキップする

for (i in 1..5) {
    if (i == 3) {
        println("3はスキップします")
        continue
    }
    println(i)
}

出力結果:

1  
2  
3はスキップします  
4  
5  

説明iが3のときにcontinueが実行され、3の処理がスキップされます。


breakcontinueのネストされたループでの使い方

ネストされたループでbreakcontinueを使用する場合、特定のループのみを制御します。

例:ラベルを使ったbreakの制御

Kotlinでは、ラベルを使って特定のループを終了できます。

outer@ for (i in 1..3) {
    for (j in 1..3) {
        if (i == 2 && j == 2) {
            println("ループを終了します")
            break@outer
        }
        println("i: $i, j: $j")
    }
}

出力結果:

i: 1, j: 1  
i: 1, j: 2  
i: 1, j: 3  
i: 2, j: 1  
ループを終了します  

説明break@outerにより、外側のループが終了します。


まとめ

  • break:ループを強制的に終了する
  • continue:現在の処理をスキップし、次の反復に進む
  • ラベル:ネストされたループで特定のループを制御する

次は、実践的なループパターンの例について解説します。

実践例:複数のループパターン

Kotlinのforループを活用した実践的なパターンを紹介します。これらの例を通じて、ループの効果的な使い方を理解し、日常のプログラミングタスクに応用しましょう。


1. リスト内の数値の合計を計算

val numbers = listOf(1, 2, 3, 4, 5)
var sum = 0

for (number in numbers) {
    sum += number
}

println("合計: $sum")

出力結果:

合計: 15

2. 2次元リストの要素を処理

val matrix = listOf(
    listOf(1, 2, 3),
    listOf(4, 5, 6),
    listOf(7, 8, 9)
)

for (row in matrix) {
    for (element in row) {
        print("$element ")
    }
    println()
}

出力結果:

1 2 3  
4 5 6  
7 8 9  

3. 奇数だけをリストから抽出

val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9)
val oddNumbers = mutableListOf<Int>()

for (number in numbers) {
    if (number % 2 != 0) {
        oddNumbers.add(number)
    }
}

println("奇数: $oddNumbers")

出力結果:

奇数: [1, 3, 5, 7, 9]

4. 文字列の中の特定の文字をカウント

val text = "kotlin programming"
var count = 0

for (char in text) {
    if (char == 'o') {
        count++
    }
}

println("文字 'o' の出現回数: $count")

出力結果:

文字 'o' の出現回数: 2

5. 多重ループでパターンを描画

for (i in 1..5) {
    for (j in 1..i) {
        print("* ")
    }
    println()
}

出力結果:

*   
* *   
* * *   
* * * *   
* * * * *   

6. マップのキーと値を条件付きで処理

val scores = mapOf("Alice" to 85, "Bob" to 92, "Charlie" to 78)

for ((name, score) in scores) {
    if (score >= 90) {
        println("$name のスコア: $score (優秀)")
    } else {
        println("$name のスコア: $score")
    }
}

出力結果:

Alice のスコア: 85  
Bob のスコア: 92 (優秀)  
Charlie のスコア: 78  

まとめ

これらの実践例を通じて、Kotlinのforループを使ったさまざまなパターンが理解できたかと思います。次は、Kotlinのforループに関する総まとめを行います。

まとめ

本記事では、Kotlinのforループに関する基本構文から応用例までを解説しました。範囲(Range)を使ったループ、コレクションの反復処理、インデックス付きループ、ステップ指定や降順ループ、ネストされたループ、そしてbreakcontinueを活用した制御方法を紹介しました。

Kotlinのforループは、シンプルかつ強力な構文で、さまざまなシチュエーションに対応できる柔軟性があります。これらの知識を活用し、効率的なコードを書けるようになりましょう。実践例や応用パターンを通して、Kotlinプログラミングのスキルをさらに高めてください。

コメント

コメントする

目次