公開日:2020/01/23更新日:2020/08/03
【Kotlin基礎】Kotlinでfor文によるループ処理を実装する方法

- Kotlinでfor文によるループ処理を実装する方法が知りたい。
- until、step、downToの使い方が知りたい。
- ListやMapをループ処理させる方法が知りたい。
- Javaで実装した場合との違いが知りたい。
- 他のループ処理についても知りたい。
本記事では、Kotlinでの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
- "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) と実装するかの違い。
- 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は出力されず、ループ処理が終了します。
- ループする際、増加する値を変更するには、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
- 変数の値を減少させながらループさせるには、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 : バナナ
- 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 円です。
- for((Key, Value) in Map)と実装することで、MapのKeyとValueを取得しながら、Mapの要素の数だけループさせることができる
for文以外のループ処理
forEachでのループ処理
forEachを使用したループ処理は、次のように実装します。
- Kotlin
(A..B).forEach {
// ループ処理
}
for文の時と同様、A..Bの部分には、『0..4』のように、繰り返すレンジを指定します。
ただ、forEachの場合、レンジ指定よりも、ListやMapをループ処理させる場合で使用されることが多いです。
forEachについての詳しい解説は、以下の記事にまとめております。
while、do-whileでのループ処理
while、do-whileを使用したループ処理は、次のように実装します。
- while
- do-while
while(条件式) {
// ループ処理
}
do {
// ループ処理
} while(条件式)
条件式がtureである限り、ループ処理が実行され続けます。
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の要素の数だけループする
関連記事