Genta Hirauchi

最終更新日:2020/01/26

【Kotlin基礎】Kotlinでfor文によるループ処理を実装する方法を解説

  • Kotlinでfor文によるループ処理を実装する方法が知りたい。
  • until、step、downToの使い方が知りたい。
  • ListやMapをループ処理させる方法が知りたい。
  • Javaで実装した場合との違いが知りたい。
  • 他のループ処理についても知りたい。

本記事では、そんな悩みを解決致します。

サンプルコードを交えた解説で、for文による基本的なループ処理や、
until、step、downToの使い方、さらに、ListやMapをループさせる方法を紹介致します。

Javaで実装した場合と、Kotlinで実装した場合の両方のコードを載せておりますので、 Javaの経験者の方にはより理解しやすい記事となっております。

目次

Kotlinでfor文によるループ処理を実装する方法

レンジでのループ処理

ループさせるレンジを指定して実装するには、次のように実装します。

  • Kotlin
for(変数 in A..B) {
 // ループ処理
}

A..Bの部分には、『0..4』のように、ループさせるレンジを指定します。

変数の部分には、任意の変数を指定します。
変数は、初回のループ時には、レンジで指定した最小の値が格納されており、 ループ処理が実行されるたびにインクリメント(1ずつ増加)していきます。

では実際の使用例を、Javaのコードと比較しながら紹介致します。

■ 0から5まで、6回ループ処理

  • Kotlin
  • Java
for(i in 0..5) {
 println(i)
}
// 0, 1, 2, 3, 4, 5
for(int i = 0; i <= 5; i++) {
 System.out.println(i);
}
// 0, 1, 2, 3, 4, 5
Point
  • "A..B" と実装すると、Bを含めた範囲をループする
  • "A..B" と実装すると、レンジ内を1ずつインクリメントする

until、step、downToの使い方

先ほど紹介したfor文は、"A..B"のレンジ内を、インクリメント(1ずつ増加)しながらループするというものでした。

しかし、実装によっては、「A..Bの内、Bは含めたくない」「2ずつ増やしたい」「デクリメント(1ずつ減少)させたい」ということがあると思います。

続いてはそれらの実装方法を紹介致します。

untilの実装方法

まずは、"A..B"のレンジ内で、Bを含めずにループさせる方法です。最後の数を含めない場合は、untilを使用します。

untilは、次のように実装します。

  • Kotlin
for(変数 in A until B) {
 // ループ処理
}

"A..B"の".."の部分をuntilに置き換え、AとBの間に半角スペースを入れます。
untilを使用することで、Bを含めないでループさせることができます。

では、実装例です。

■ 3から7まで(8を含めないで)ループさせる処理

  • Kotlin
  • Java
for(i in 3 until 8) {
 println(i)
}
// 3, 4, 5, 6, 7
for(int i = 3; i < 8; i++) {
 System.out.println(i);
}
// 3, 4, 5, 6, 7

untilを使用せずに、"3..7"でも同じ結果を得られますが、配列のサイズ分ループさせる場合などは、untilを使用する方が、可読性が上がるかもしれませんね。
for(i in 0..list.size - 1) と実装するか、for(i in 0 until list.size) と実装するかの違い。

Point
  • A~Bまでループさせる際に、Bを含めない場合はuntilを使用する

stepの実装方法

続いて、ループ処理が実行されるたびに、任意の数ずつ変数の値を増やす方法を紹介致します。

任意の数ずつ変数の値を増やすには、stepを使用します。

stepは、次のように実装します。

  • Kotlin
for(変数 in A..B step 値) {
 // ループ処理
}

for文のレンジ指定の後に、"step 値"を実装することで、ループ処理が実行されるたびに、値の数ずつ変数の値が増加していきます。

では、実装例です。

■ 0から5までを、2ずつ増加しながらループする処理

  • Kotlin
  • Java
for(i in 0..5 step 2) {
 println(i)
}
// 0, 2, 4
for (int i = 0; i <= 5; i += 2) {
 System.out.println(i);
}
// 0, 2, 4

iの値は、0, 2, 4, 6と2ずつ増えていきます。
レンジが0~5なので、6は出力されず、ループ処理が終了します。

Point
  • ループする際、増加する値を変更するには、stepを使用する

downToの実装方法

続いて、ループ処理が実行されるたびに、変数の値をデクリメント(1ずつ減少)させる方法を紹介致します。

変数の値をデクリメントさせるには、downToを使用します。

downToは、次のように実装します。

  • Kotlin
for(i in A downTo B) {
 // ループ処理
}

"A downTo B"と実装することで、ループ処理が実行されるたびに、変数の値がデクリメントしていきます。
デクリメントするので、Aには、Bよりも大きい値を指定する必要があります。

では、実装例です。

■ 5から0までを、デクリメントしながらループする処理

  • Kotlin
  • Java
for(i in 5 downTo 0) {
 println(i)
}
// 5, 4, 3, 2, 1, 0
for (int i = 5; i >= 0; i--) {
 System.out.println(i);
}
// 5, 4, 3, 2, 1, 0

iの値は、5~0まで1ずつ減少していきます。

ちなみに、stepと組み合わせることもできます。
stepを使用した場合は、デクリメントではなく、stepで指定した値ずつ減少していきます。

  • Kotlin
  • Java
for(i in 5 downTo 0 step 2) {
 println(i)
}
// 5, 3, 1
for (int i = 5; i >= 0; i -= 2) {
 System.out.println(i);
}
// 5, 3, 1
Point
  • 変数の値を減少させながらループさせるには、downToを使用する

Listのループ処理

Listの要素の数だけ順番にループさせていくには、次のように実装します。

  • Kotlin
for(変数 in List) {
 // ループ処理
}

ループされるたび、変数には、Listの要素が順番に入ってきます。

では、実装例です。

■ 果物の名前を順番に出力する処理

  • Kotlin
  • Java
val list = arrayOf("ミカン", "リンゴ", "メロン", "モモ", "バナナ")
for(i in list) {
   println(i)
}
// ミカン, リンゴ, メロン, モモ, バナナ
String[] list = {"ミカン", "リンゴ", "メロン", "モモ", "バナナ"};
for (String i : list) {
   System.out.println(i);
}
// ミカン, リンゴ, メロン, モモ, バナナ

また、ループ処理中に、要素のindexを知りたい事があるかもしれません。
その場合は、indicesを使用します。

  • Kotlin
val list = arrayOf("ミカン", "リンゴ", "メロン", "モモ", "バナナ")
for(i in list.indices) {
   println("$i : ${list[i]}")
}
// 0 : ミカン, 1 : リンゴ, 2 : メロン, 3 : モモ, 4 : バナナ

「いやいや、indexと要素の両方を取得したい!」という場合は、withIndexを使用します。

  • Kotlin
val list = arrayOf("ミカン", "リンゴ", "メロン", "モモ", "バナナ")
for((index, value) in list.withIndex()) {
   println("$index : $value")
}
// 0 : ミカン, 1 : リンゴ, 2 : メロン, 3 : モモ, 4 : バナナ
Point
  • for(変数 in List)と実装することで、Listの要素の数だけループすることができる
  • indicesを使用することで、Listのindexを取得できる
  • withIndexを使用することで、indexと要素の両方を取得できる

Mapのループ処理

最後に、Mapのループ処理を紹介致します。Listの要素の数だけ順番にループさせていくには、次のように実装します。

  • Kotlin
for((Key, Value) in Map) {
   // ループ処理
}

ループされるたび、KeyとValueを取得することができます。

では、実装例です。

■ 果物の名前と値段を順番に出力する処理

  • Kotlin
  • Java
val map = mapOf("リンゴ" to 80, "ミカン" to 100, "メロン" to 1000)
for ((name, price) in map) {
   println("$name は $price 円です。")
}

// リンゴ は 80 円です。
// ミカン は 100 円です。
// メロン は 1000 円です。
Map map = new HashMap<>();
map.put("リンゴ", 80);
map.put("ミカン", 100);
map.put("メロン", 1000);

for(Map.Entry entry : map.entrySet()) {
   System.out.println(entry.getKey() + " は " + entry.getValue().toString() + " 円です。");
}

// リンゴ は 80 円です。
// ミカン は 100 円です。
// メロン は 1000 円です。
Point
  • for((Key, Value) in Map)と実装することで、MapのKeyとValueを取得しながら、Mapの要素の数だけループさせることができる

for文以外のループ処理

forEachでのループ処理

forEachを使用したループ処理は、次のように実装します。

  • Kotlin
(A..B).forEach {
   // ループ処理
}

A..Bの部分には、『0..4』のように、ループさせるレンジを指定します。

ただ、forEachの場合、レンジ指定よりも、ListやMapをループ処理させたいい場合で使用することが多いです。

forEachについての詳しい解説は、以下の記事にまとめておりますので、こちらもご参照ください。

【Kotlin基礎】KotlinでforEachによるループ処理を実装する方法

本記事では、forEachによるListやMapループ処理の実装方法をサンプルコードでわかりやすく解説しております。

while、do-whileでのループ処理

while、do-whileを使用したループ処理は、次のように実装します。

  • while
  • do-while
while(条件式) {
   // ループ処理
}
do {
   // ループ処理
} while(条件式)

条件式がtureである限り、ループ処理が実行され続けます。

whileは、条件式の判定が行われた後、ループ処理が実行されます。一方do-whileは、ループ処理が実行された後、条件式の判定が行われます。

while、do-whileについての詳しい解説は、以下の記事にまとめておりますので、詳しく知りたい方は、こちらの記事をご覧いただければと思います。

【Kotlin基礎】Kotlinでwhile、do-whileによるループ処理を実装する方法

while、do-whileでループ処理を実装する方法を解説しております。サンプルコードによる解説や、重要ポイントのまとめもあります。

まとめ

  • for(変数 in A..B)で、A~Bの範囲をインクリメントしながらループする
  • for(変数 in A until B)で、A~B(Bを含まない)の範囲をインクリメントしながらループする
  • for(変数 in A..B step 値)で、A~Bの範囲を、"値"で指定した数値ずつ増加しながらループする
  • for(i in A downTo B)で、A~Bの範囲を、デクリメントしながらループする
  • for(変数 in List)で、Listの要素の数だけループする
  • for((Key, Value) in Map)で、Mapの要素の数だけループする