Skip to content

制御フロー

他のプログラミング言語と同様に、Kotlinはコードがtrueと評価されるかどうかに基づいて決定を下すことができます。このようなコードは条件式と呼ばれます。Kotlinはループを作成し、繰り返し処理を行うこともできます。

条件式

Kotlinは条件式をチェックするためにifwhenを提供しています。

NOTE

ifwhenのどちらかを選択しなければならない場合、whenの使用をお勧めします。それは以下の理由によります。

  • コードが読みやすくなります。

  • 別の分岐を追加しやすくなります。

  • コード内の間違いが少なくなります。

If

ifを使用するには、条件式を括弧()内に、結果がtrueの場合に実行するアクションを波括弧{}内に記述します。

kotlin
fun main() {
    val d: Int
    val check = true

    if (check) {
        d = 1
    } else {
        d = 2
    }

    println(d)
    // 1
}

Kotlinには三項演算子condition ? then : elseはありません。代わりに、ifは式として使用できます。各アクションのコードが1行のみの場合、波括弧{}は省略可能です。

kotlin
fun main() { 
    val a = 1
    val b = 2

    println(if (a > b) a else b) // Returns a value: 2
}

When

複数の分岐を持つ条件式がある場合は、whenを使用します。

whenを使用するには:

  • 評価したい値を括弧()内に配置します。
  • 分岐を波括弧{}内に配置します。
  • 各分岐で->を使用して、チェックと、チェックが成功した場合に実行するアクションを区切ります。

whenは文 (statement) または式 (expression) として使用できます。**文 (statement)**は何も返しませんが、アクションを実行します。

whenを文として使用する例を以下に示します。

kotlin
fun main() {
    val obj = "Hello"

    when (obj) {
        // Checks whether obj equals to "1"
        "1" -> println("One")
        // Checks whether obj equals to "Hello"
        "Hello" -> println("Greeting")
        // Default statement
        else -> println("Unknown")     
    }
    // Greeting
}

NOTE

すべての分岐条件は、いずれかが満たされるまで順次チェックされることに注意してください。したがって、最初に適合した分岐のみが実行されます。

**式 (expression)**は、後でコードで使用できる値を返します。

whenを式として使用する例を以下に示します。when式はすぐに変数に割り当てられ、後でprintln()関数で使用されます。

kotlin
fun main() {
    val obj = "Hello"    
    
    val result = when (obj) {
        // If obj equals "1", sets result to "one"
        "1" -> "One"
        // If obj equals "Hello", sets result to "Greeting"
        "Hello" -> "Greeting"
        // Sets result to "Unknown" if no previous condition is satisfied
        else -> "Unknown"
    }
    println(result)
    // Greeting
}

これまでに見てきたwhenの例はどちらも主題 (obj) を持っていました。しかし、whenは主題なしでも使用できます。

この例では、主題なしwhen式を使用して、Boolean式の連鎖をチェックしています。

kotlin
fun main() {
    val trafficLightState = "Red" // This can be "Green", "Yellow", or "Red"

    val trafficAction = when {
        trafficLightState == "Green" -> "Go"
        trafficLightState == "Yellow" -> "Slow down"
        trafficLightState == "Red" -> "Stop"
        else -> "Malfunction"
    }

    println(trafficAction)
    // Stop
}

ただし、trafficLightStateを主題として同じコードを作成することもできます。

kotlin
fun main() {
    val trafficLightState = "Red" // This can be "Green", "Yellow", or "Red"

    val trafficAction = when (trafficLightState) {
        "Green" -> "Go"
        "Yellow" -> "Slow down"
        "Red" -> "Stop"
        else -> "Malfunction"
    }

    println(trafficAction)  
    // Stop
}

whenを主題とともに使用すると、コードが読みやすく、保守しやすくなります。when式を主題とともに使用すると、Kotlinがすべての可能なケースが網羅されていることを確認するのにも役立ちます。そうでない場合、when式を主題なしで使用すると、else分岐を提供する必要があります。

条件式の練習問題

練習問題 1

2つのサイコロを振って同じ数字が出た場合に勝利するシンプルなゲームを作成します。サイコロが一致した場合はYou win :)と、そうでない場合はYou lose :(と出力するためにifを使用します。

TIP

この演習では、ランダムなIntを取得するためにRandom.nextInt()関数を使用できるように、パッケージをインポートします。パッケージのインポートに関する詳細については、パッケージとインポートを参照してください。

ヒント

サイコロの結果を比較するには、等価演算子==)を使用します。

|---|---|

kotlin
import kotlin.random.Random

fun main() {
    val firstResult = Random.nextInt(6)
    val secondResult = Random.nextInt(6)
    // Write your code here
}

|---|---|

kotlin
import kotlin.random.Random

fun main() {
    val firstResult = Random.nextInt(6)
    val secondResult = Random.nextInt(6)
    if (firstResult == secondResult)
        println("You win :)")
    else
        println("You lose :(")
}

練習問題 2

when式を使用して、ゲーム機のボタン名を入力したときに対応するアクションが出力されるように、次のプログラムを更新します。

ボタンアクション
Aはい
Bいいえ
Xメニュー
Y何もなし
Otherそのようなボタンはありません

|---|---|

kotlin
fun main() {
    val button = "A"

    println(
        // Write your code here
    )
}

|---|---|

kotlin
fun main() {
    val button = "A"
    
    println(
        when (button) {
            "A" -> "Yes"
            "B" -> "No"
            "X" -> "Menu"
            "Y" -> "Nothing"
            else -> "There is no such button"
        }
    )
}

範囲 (Ranges)

ループが反復処理を行うための範囲を構築する方法を知っておくと、ループについて話す前に役立ちます。

Kotlinで範囲を作成する最も一般的な方法は、..演算子を使用することです。たとえば、1..41, 2, 3, 4と同等です。

終了値を含まない範囲を宣言するには、..<演算子を使用します。たとえば、1..<41, 2, 3と同等です。

逆順で範囲を宣言するには、downToを使用します。たとえば、4 downTo 14, 3, 2, 1と同等です。

1ではないステップでインクリメントする範囲を宣言するには、stepと希望する増分値を使用します。たとえば、1..5 step 21, 3, 5と同等です。

Char型の範囲でも同様に行うことができます。

  • 'a'..'d''a', 'b', 'c', 'd'と同等
  • 'z' downTo 's' step 2'z', 'x', 'v', 't'と同等

ループ

プログラミングで最も一般的な2つのループ構造はforwhileです。forは値の範囲を反復処理し、アクションを実行するために使用します。whileは特定の条件が満たされるまでアクションを続行するために使用します。

For

範囲に関する新しい知識を使って、1から5までの数値を反復処理し、その都度数値を出力するforループを作成できます。

イテレータと範囲をキーワードinとともに括弧()内に配置します。実行したいアクションを波括弧{}内に記述します。

kotlin
fun main() {
    for (number in 1..5) { 
        // number is the iterator and 1..5 is the range
        print(number)
    }
    // 12345
}

コレクションもループで反復処理できます。

kotlin
fun main() { 
    val cakes = listOf("carrot", "cheese", "chocolate")

    for (cake in cakes) {
        println("Yummy, it's a $cake cake!")
    }
    // Yummy, it's a carrot cake!
    // Yummy, it's a cheese cake!
    // Yummy, it's a chocolate cake!
}

While

whileは2つの方法で使用できます。

  • 条件式がtrueである間、コードブロックを実行する。 (while)
  • まずコードブロックを実行し、その後に条件式をチェックする。 (do-while)

最初の使用例 (while) では:

  • whileループを続行するための条件式を括弧()内に宣言します。
  • 実行したいアクションを波括弧{}内に記述します。

TIP

以下の例では、cakesEaten変数の値をインクリメントするために、インクリメント演算子 ++を使用しています。

kotlin
fun main() {
    var cakesEaten = 0
    while (cakesEaten < 3) {
        println("Eat a cake")
        cakesEaten++
    }
    // Eat a cake
    // Eat a cake
    // Eat a cake
}

2番目の使用例 (do-while) では:

  • whileループを続行するための条件式を括弧()内に宣言します。
  • キーワードdoとともに、実行したいアクションを波括弧{}内に定義します。
kotlin
fun main() {
    var cakesEaten = 0
    var cakesBaked = 0
    while (cakesEaten < 3) {
        println("Eat a cake")
        cakesEaten++
    }
    do {
        println("Bake a cake")
        cakesBaked++
    } while (cakesBaked < cakesEaten)
    // Eat a cake
    // Eat a cake
    // Eat a cake
    // Bake a cake
    // Bake a cake
    // Bake a cake
}

条件式とループに関する詳細情報と例については、条件とループを参照してください。

Kotlinの制御フローの基本を理解したところで、独自の関数の書き方を学ぶ時が来ました。

ループの練習問題

練習問題 1

8切れのピザが丸ごとできるまでピザの切れ数を数えるプログラムがあります。このプログラムを2つの方法でリファクタリングします。

  • whileループを使用する。
  • do-whileループを使用する。

|---|---|

kotlin
fun main() {
    var pizzaSlices = 0
    // Start refactoring here
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    // End refactoring here
    println("There are $pizzaSlices slices of pizza. Hooray! We have a whole pizza! :D")
}

|---|---|

kotlin
fun main() {
    var pizzaSlices = 0
    while ( pizzaSlices < 7 ) {
        pizzaSlices++
        println("There's only $pizzaSlices slice/s of pizza :(")
    }
    pizzaSlices++
    println("There are $pizzaSlices slices of pizza. Hooray! We have a whole pizza! :D")
}

|---|---|

kotlin
fun main() {
    var pizzaSlices = 0
    pizzaSlices++
    do {
        println("There's only $pizzaSlices slice/s of pizza :(")
        pizzaSlices++
    } while ( pizzaSlices < 8 )
    println("There are $pizzaSlices slices of pizza. Hooray! We have a whole pizza! :D")
}

練習問題 2

Fizz buzzゲームをシミュレートするプログラムを記述します。タスクは、1から100までの数字を段階的に出力し、3で割り切れる数字を「fizz」という単語に、5で割り切れる数字を「buzz」という単語に置き換えることです。3と5の両方で割り切れる数字は「fizzbuzz」という単語に置き換えなければなりません。

ヒント 1

数値を数えるにはforループを、各ステップで何を出力するかを決定するにはwhen式を使用します。

ヒント 2

数値を割った余りを返すには剰余演算子(%)を使用します。余りがゼロに等しいかどうかを確認するには、等価演算子==)を使用します。

|---|---|

kotlin
fun main() {
    // Write your code here
}

|---|---|

kotlin
fun main() {
    for (number in 1..100) {
        println(
            when {
                number % 15 == 0 -> "fizzbuzz"
                number % 3 == 0 -> "fizz"
                number % 5 == 0 -> "buzz"
                else -> "$number"
            }
        )
    }
}

練習問題 3

単語のリストがあります。forifを使用して、文字lで始まる単語のみを出力します。

ヒント

String型に対する.startsWith()関数を使用します。

|---|---|

kotlin
fun main() {
    val words = listOf("dinosaur", "limousine", "magazine", "language")
    // Write your code here
}

|---|---|

kotlin
fun main() {
    val words = listOf("dinosaur", "limousine", "magazine", "language")
    for (w in words) {
        if (w.startsWith("l"))
            println(w)
    }
}

次のステップ

関数