Kotlinでループを回数指定して使う12の方法

Kotlinでのループを回数指定して使うイラストKotlin
この記事は約18分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

この記事を読めば、Kotlinでループを回数指定して使うことができるようになります。

Kotlinを始めてみたけど、ループの回数指定方法がいまいちわからない、そう感じているあなたへ。

この記事はまさに、そんなあなたのために書かれました。

それでは、一緒に、Kotlinの魅力を最大限に活かすループの活用方法を学んでいきましょう!

●Kotlinのループとは

Kotlinのループは、特定の操作を繰り返し実行するための仕組みです。

例えば、同じ処理を10回繰り返したい、あるいはリストの各要素に対して操作を行いたい、という場合にループが役立ちます。

○基本的なループの種類

Kotlinにはいくつかのループの種類が存在しますが、主なものとしては「forループ」と「whileループ」があります。

これらのループはそれぞれ異なるシチュエーションでの利用が推奨されています。

具体的には、forループは繰り返し回数が予め分かっている場合や、コレクションの要素を順番に処理する場合に、whileループは繰り返し回数が予め分からない場合に使用されます。

○ループの特徴と使い方

ループはその名の通り、指定された条件が満たされている限り処理を繰り返し実行する特性を持っています。

この特性を活かして、同じ処理を複数回実行したり、コレクションの要素を一つずつ取り出して処理を行うといったことが可能となります。

forループは、繰り返しを行う範囲や回数を指定してループを実行することができる特性を持っています。

一方、whileループは、指定された条件がtrueである限りループを繰り返し実行します。

この特性の違いを理解し、適切なループを選んで使用することが、効率的なプログラムを書くための鍵となります。

●Kotlinでの回数指定ループの使い方

Kotlinにおいて、繰り返しの回数を指定してループを実行する方法は非常に直感的で、初心者でも簡単に理解できるようになっています。

さまざまなシチュエーションに対応するためのループの書き方を、具体的なサンプルコードと共に解説していきます。

○サンプルコード1:基本的なforループの使用例

最もシンプルなforループの使い方から見ていきましょう。

下記のサンプルコードは、0から4までの数値を順番に出力する例です。

fun main() {
    for (i in 0..4) {
        println(i)
    }
}

このコードではforキーワードを使ってループを作成しています。

in 0..4という部分で0から4までの範囲を指定しています。

この例を実行すると、0から4までの数値が順に出力されます。

○サンプルコード2:範囲を指定してforループを使用する方法

Kotlinのforループでは、範囲を指定することで、特定の値の間でループを実行することができます。

下記のサンプルコードでは、3から7までの数値を順番に出力しています。

fun main() {
    for (i in 3..7) {
        println(i)
    }
}

この例ではin 3..7という部分で3から7までの範囲を指定しています。

このコードを実行すると、3から7までの数値が順に出力されます。

○サンプルコード3:whileループを使って回数指定する方法

whileループは、指定した条件がtrueの間、ループを繰り返し実行します。この性質を利用して、回数指定でのループを実現することができます。

具体的には、カウンタ変数を用いてその値が特定の数値に達するまでループを続けるという方法です。

下記のサンプルコードは、0から4までの数値を順番に出力する例です。

fun main() {
    var counter = 0
    while (counter <= 4) {
        println(counter)
        counter++
    }
}

このコードの中心部分はwhile (counter <= 4)です。

ここで、カウンタ変数counterの値が4以下の場合、ループが継続されます。

そして、ループ内でcounter++により、counterの値を1ずつ増やしていきます。

この例を実行すると、0から4までの数値が順に出力されます。

○サンプルコード4:do-whileループを使う方法

do-whileループは、whileループとは逆に、最初の1回は条件に関係なく実行し、その後指定した条件がtrueの間、ループを繰り返します。

下記のサンプルコードは、0から4までの数値を順番に出力する例ですが、do-whileループを使用しています。

fun main() {
    var counter = 0
    do {
        println(counter)
        counter++
    } while (counter <= 4)
}

このコードを実行すると、whileループと同様に0から4までの数値が順に出力されますが、do-whileループの特性上、counterの初期値が5以上であっても最初の1回は必ずループ内のコードが実行されます。

この特性は、少なくとも1回は処理を実行したい場面で役立ちます。

○サンプルコード5:forEachループの使用例

Kotlinでは、コレクションや範囲に対して、その要素ごとに処理を行いたい場合、forEachという便利な関数を使うことができます。

このforEachは、内部的にはループを使用しており、各要素に対して指定された処理を実行します。

例として、リストに含まれる文字列を全て大文字にして出力するコードを考えます。

fun main() {
    val names = listOf("taro", "hanako", "jiro")
    names.forEach { name ->
        val upperName = name.uppercase()
        println(upperName)
    }
}

このコードでは、listOfで文字列のリストを作成しています。

次に、forEach関数を使ってリストの各要素に対して、その要素を大文字に変換したものを出力しています。

この場合、リストの各要素がnameという変数に一時的に格納され、{}内の処理が各要素に対して実行される構造となっています。

○サンプルコード6:stepを使って増減させながらループする方法

Kotlinのループで、特定の増減幅で繰り返しを実行したい場合、stepというキーワードを使います。

これを使用すると、一定のステップ幅でループを進めることができます。

例として、0から10までの数字を2ずつ増やしながら出力するコードを考えます。

fun main() {
    for (i in 0..10 step 2) {
        println(i)
    }
}

このコードでは、0から10までの数を2つずつ増やしながら出力しています。

つまり、0, 2, 4, 6, 8, 10という順に数値が出力されます。step 2という部分が、2つずつ増やすという指定をしています。

○サンプルコード7:downToを使って逆順のループをする方法

Kotlinでのループは、通常の昇順だけでなく、逆順での繰り返しも簡単に実現できます。

その際に使用するのが、downToというキーワードです。

このキーワードを使用すると、指定した数値から逆順にデクリメントしながらループを実行できます。

具体的には、10から1まで逆順で数字を出力するサンプルコードを見てみましょう。

fun main() {
    for (i in 10 downTo 1) {
        println(i)
    }
}

上記のコードを実行すると、10から1までの数字が逆順で出力されます。

この場合、downToを使って、10から1までの範囲を指定しています。

○サンプルコード8:特定の条件を満たす間ループを続ける方法

Kotlinでは、特定の条件を満たしている間ループを続けることが可能です。

これを実現するためのループは、whileループやdo-whileループがありましたが、より複雑な条件を設定してループを制御する方法もあります。

例えば、1から10までの数字の中で、3の倍数だけを出力するサンプルコードを考えてみます。

fun main() {
    for (i in 1..10) {
        if (i % 3 == 0) {
            println(i)
        }
    }
}

このコードでは、1から10までの数字をループしています。

その中で、i % 3 == 0という条件式を使って、3で割った余りが0となる数値、つまり3の倍数だけを出力するようにしています。

○サンプルコード9:breakを使ってループを途中で終了する方法

ループの中で特定の条件が満たされた時点で、それ以上ループを続ける必要がない場面があります。そのような場合、Kotlinではbreakというキーワードを使用して、ループを途中で終了させることができます。

たとえば、1から100までの数を順に表示するループがあるとして、その数が50に到達したら、それ以降の数字を表示せずにループを終了したい場合を考えてみましょう。

fun main() {
    for (i in 1..100) {
        if (i > 50) {
            break
        }
        println(i)
    }
}

このコードでは、iが50より大きくなった時点でbreakが実行され、ループは即座に終了します。結果として、1から50までの数のみが出力されることとなります。

○サンプルコード10:continueを使って次のループへスキップする方法

breakとは対照的に、特定の条件で現在のループだけをスキップして、次のループに移行したい場合には、continueを利用します。

例として、1から10までの数字を表示するループで、5だけをスキップして表示したい場合のコードを見てみましょう。

fun main() {
    for (i in 1..10) {
        if (i == 5) {
            continue
        }
        println(i)
    }
}

上記のコードを実行すると、1, 2, 3, 4, 6, 7, 8, 9, 10と、5を除いた数字が出力されます。

iが5の時、continueが実行され、その後のprintln(i)はスキップされ、次のループに移行します。

このように、Kotlinでのループ制御は、breakcontinueなどのキーワードを活用することで、柔軟に行うことができます。

初心者の方でも、これらのキーワードをマスターすることで、より効率的なループの制御が可能となります。

○サンプルコード11:複数のリストを同時にループする方法

時に、複数のリストを同時にループして、それぞれの要素を一緒に扱いたい場面があります。

Kotlinでは、zip関数を使用することで、このようなループも簡単に実現できます。

2つのリスト、一つは都市名、もう一つはその都市の人口を表すリストを同時にループして、それぞれの都市と人口を表示する例を考えてみます。

fun main() {
    val cities = listOf("東京", "大阪", "名古屋")
    val populations = listOf(13750000, 8830000, 2290000)

    for ((city, population) in cities.zip(populations)) {
        println("都市名: $city, 人口: $population")
    }
}

上記のコードでは、zip関数を使って2つのリストを結合し、それをループしています。

このコードを実行すると、各都市とその人口が一緒に出力されます。

○サンプルコード11:複数のリストを同時にループする方法

複数のリストを一つのループで同時に処理する場面は頻繁に遭遇します。

特に、関連性を持つデータを複数のリストで管理している際にその関連性を元に何らかの処理を行いたいときなどです。

Kotlinでは、このような場面で非常に役立つzip関数が提供されています。

具体的には、都市名を管理するリストと、その都市の人口を管理するリストがあった場合、これらを組み合わせて都市名と人口をペアで取り出して処理したい場面を考えてみましょう。

fun main() {
    val cities = listOf("東京", "大阪", "名古屋")
    val populations = listOf(13750000, 8830000, 2290000)

    for ((city, population) in cities.zip(populations)) {
        println("都市名: $city, 人口: $population")
    }
}

このコードでは、zip関数を利用してcitiesリストとpopulationsリストを結合しています。

そして、forループでそれぞれの要素をペアとして取り出しています。

この結果、都市名と人口を同時に取り扱うことが可能になります。

このコードを実行すると、都市名とその都市の人口がペアとして出力される結果を得られます。

○サンプルコード12:インデックス付きでループする方法

リストや配列をループ処理する際、要素だけでなく、その要素のインデックス(位置情報)も同時に取得したい場面があります。

Kotlinでは、withIndex関数を使うことで、インデックス付きのループを簡単に実装することができます。

例として、都市名を管理するリストから都市名とそのインデックスを取得して表示するコードを考えてみましょう。

fun main() {
    val cities = listOf("東京", "大阪", "名古屋")

    for ((index, city) in cities.withIndex()) {
        println("インデックス: $index, 都市名: $city")
    }
}

このコードでは、withIndex関数を使ってリストの各要素とそのインデックスを同時に取得しています。

その後、forループでインデックスと都市名を取り出して表示しています。

このコードを実行すると、都市名とそのインデックスがペアとして出力される結果を得られます。

●Kotlinのループの応用例

Kotlinでのループ処理は単なる繰り返し処理だけでなく、さまざまな応用例で活躍します。

今回は、ループを使用した数当てゲームと、文字列のパターン生成の2つの応用例をご紹介します。

○サンプルコード13:ループを使ったシンプルな数当てゲーム

数当てゲームはプログラムの学習でよく取り上げられる題材の一つです。

Kotlinでのループを使用して、1から100までの数字をランダムに選び、ユーザーに当てさせるシンプルなゲームを作成します。

fun main() {
    val targetNumber = (1..100).random()
    var guess: Int
    var attempts = 0

    do {
        println("1から100までの数字を入力してください:")
        guess = readLine()!!.toInt()
        attempts++

        when {
            guess < targetNumber -> println("もっと大きい数字です!")
            guess > targetNumber -> println("もっと小さい数字です!")
            else -> println("正解です! $attempts 回目で当たりました!")
        }
    } while (guess != targetNumber)
}

このコードでは、do-whileループを使ってユーザーからの入力を受け取り、正解するまでループが続きます。

当たりの数字よりも小さい、または大きい場合は、それを示すヒントを出力します。

このコードを実行すると、ユーザーが正解するまでの試行回数とヒントを表示しながらゲームを進行させることができます。

○サンプルコード14:ループを使って文字列のパターンを生成する方法

テキストデータの処理や解析において、特定のパターンの文字列を生成することはよくあります。

ここでは、アスタリスク(*)とハイフン(-)を交互に繰り返す文字列を生成するシンプルな例をご紹介します。

fun main() {
    val length = 10
    val pattern = StringBuilder()

    for (i in 1..length) {
        if (i % 2 == 0) {
            pattern.append("-")
        } else {
            pattern.append("*")
        }
    }

    println(pattern.toString())
}

このコードでは、forループを使用して指定された長さの文字列を生成します。

ループ変数iが偶数の場合はハイフンを、奇数の場合はアスタリスクをpatternに追加しています。

このコードを実行すると、”-*”のような文字列が出力されます。

●Kotlinのループの注意点と対処法

Kotlinでのループ処理は非常に便利ですが、使用する際にいくつかの注意点があります。

正しくループを活用するために、これらの注意点を理解し、適切に対処することが重要です。

○多重ループの取り扱い

多重ループとは、ループの中にさらにループが存在することを指します。

このような構造は、2次元配列や行列の要素にアクセスする際などに用いられますが、処理の複雑さが増し、可読性が低下する可能性があります。

// 5x5の2次元配列を生成
val matrix = Array(5) { IntArray(5) { it } }

// 多重ループで2次元配列の要素を表示
for (row in matrix) {
    for (value in row) {
        print("$value ")
    }
    println()
}

このコードでは5×5の2次元配列を生成し、その要素を多重ループを使用して表示しています。

しかし、多重ループのネストが深くなると、プログラムの流れが追いにくくなるため、使用を控えるか、他の方法を検討することがおすすめです。

○無限ループのリスクと回避方法

ループ処理の中で終了条件を間違えると、無限にループが続いてしまう「無限ループ」が発生することがあります。

これは、システムのリソースを無駄に消費したり、アプリケーションが応答しなくなる原因となります。

例えば、次のようなwhileループは無限ループとなります。

var value = 1
while (value > 0) {
    // このループはvalueが常に正のため、終わらない
}

無限ループを避けるためには、ループの終了条件をしっかりと考え、テストを行い、期待通りに動作することを確認することが必要です。

また、ループの中での変数の更新や条件式の確認を忘れないようにしましょう。

●Kotlinのループのカスタマイズ方法

Kotlinでのループは、基本的な使い方だけでなく、カスタマイズして更に効果的に活用することができます。

ここでは、Kotlinでのループをカスタマイズする方法と、ラムダ式を組み合わせての応用例について詳しく解説していきます。

○カスタムループの作成方法

Kotlinでは、独自のイテレータを提供することで、カスタムループを実装することができます。

これにより、特定のロジックやデータ構造に合わせたループを作成することが可能となります。

// カスタムイテレータの定義
class MyRange(val start: Int, val end: Int) {
    operator fun iterator(): Iterator<Int> {
        return object : Iterator<Int> {
            var current = start
            override fun hasNext(): Boolean = current <= end
            override fun next(): Int = current++
        }
    }
}

// カスタムループの利用例
for (i in MyRange(2, 6)) {
    println(i)
}

このコードでは、2から6までの整数を返すカスタムイテレータMyRangeを定義しています。

そして、このカスタムイテレータを使って、forループでの繰り返し処理を行っています。

○ラムダ式とループの組み合わせ

Kotlinはラムダ式のサポートが強力で、これをループと組み合わせることで、更に柔軟な操作が可能となります。

特に、コレクションやリストに対する操作を効率的に行うことができます。

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

// ラムダ式を使用したループの例
numbers.forEach { number ->
    println("数字は $number です")
}

// filterとmapを組み合わせた高階関数の利用例
val squaredEvenNumbers = numbers.filter { it % 2 == 0 }.map { it * it }
println(squaredEvenNumbers)

このコードでは、まずリストnumbersに対して、ラムダ式を使ったforEachループで各要素を出力しています。

次に、filterとmapの高階関数を組み合わせて、偶数のみを抽出し、それらの数を二乗した新しいリストsquaredEvenNumbersを生成しています。

まとめ

Kotlinでのループ操作は非常に柔軟で強力です。

基本的なforループやwhileループから、カスタマイズループ、そしてラムダ式を用いた高階関数の利用まで、幅広い使い方が可能です。

特に、Kotlinの高階関数やラムダ式を組み合わせることで、コードの簡潔性や読みやすさが向上し、より効率的な操作が可能となります。

繰り返しの処理は多くのプログラミングタスクで必須の要素ですので、Kotlinでのループの知識は非常に価値があります。

今後のプログラミング作業で、本記事で学んだ知識を存分に活用し、効果的なコードを書いていくことをおすすめします。