覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Kotlin - 繰り返し処理

Kotlin における while ループは Java と同じですが、 for ループは、Javaにおける for-each に該当するものしか存在しません。
いわゆるインデックス指定での for ループはありません。


whileループ

Kotlin には while と do-while のループが存在していて、Javaでの記述方法と変わりありません

while (条件) {
  // do something
}
do {
  // do something
} while (条件)


レンジでの繰り返し処理

Kotlinでは、ループ用のインデックスを初期化し各ステップでそのインデックスの変数をインクリメントして、境界に達したらループを抜けるというというような、Javaの通常のforループが存在しません。

こういったケースでは、Kotlinではレンジ(range)を使用します。
例えば、1〜9の範囲は以下のように書けます。

val oneToNine = 1..9

Kotin のレンジは閉じて(closed)いて、包括的(inclusive)です。つまり2つ目の値がレンジの中に中に含まれるということになります。(上記の例だと 9 がレンジ内に含まれている)

例えば以下のコードを実行すると

fun main() {
    val oneToNine = 1..9

    for (value in oneToNine) {
        print("$value ")
    }
}

結果は以下のようになり、1 から 9 まで含まれていることがわかります

1 2 3 4 5 6 7 8 9 


step を利用すると間を飛ばすことも可能です

fun main() {
    val oneToNine = 1..9

    for (value in oneToNine step 2) {
        print("$value ")
    }
}

◾️実行結果

1 3 5 7 9 


レンジの .. の記法では、エンドポイントを必ず含んでしまいますが、until関数を使うことでエンドポイントを含まないレンジを作る事ができます。

for (value in 0 until max)

というループでは 0..max-1 のループを意味することになります。


fun main() {
    for (value in 0 until 5) {
        print("$value ")
    }
}

上記コードを実行すると結果は以下の通りとなり、 エンドポイントの 5 を含んでいない事がわかります。

0 1 2 3 4 


Listの繰り返し処理

List でもforループ処理は可能です。まー当たり前ですかね。

fun main() {
    val list = arrayListOf("Taro", "Jiro", "Saburo", "Hanako")

    for (value in list) {
        println("I am $value.")
    }
}

◾️実行結果

I am Taro.
I am Jiro.
I am Saburo.
I am Hanako.


Mapの繰り返し処理

key:名前、 value:持ち金 というマップをループさせる処理です。

fun main() {
    val map = mapOf("Ken" to 1000, "Jon" to 1500, "Hanako" to 10000)

    for ((name, money) in map) {
        println("$name has $money yen.")
    }
}


結果は以下の通りです

Ken has 1000 yen.
Jon has 1500 yen.
Hanako has 10000 yen.

for ループが繰り返し処理を行なっている要素を分解して、マップのキーと値にしていることがわかります。


コレクションの繰り返し処理でインデックスを取得

Mapをキーと値に分解して繰り返し処理したように、コレクションの現在の項目のインデックスを取得しながら繰り返し処理をすることができます。(withIndex を利用)

fun main() {
    val list = arrayListOf("Taro", "Jiro", "Saburo", "Hanako")

    for ((index, element) in list.withIndex()) {
        println("list[$index] -> $element")
    }
}

実行結果は以下の通りです。インデックスも取得できています。

list[0] -> Taro
list[1] -> Jiro
list[2] -> Saburo
list[3] -> Hanako