
「for」ってなんだ? – いまさら聞けないKotlinのなぜ
Kotlinのfor文(ループ処理)とは、命令を繰り返し処理することのできる便利な記法のことです。繰り返し処理される物は単一値でも複数値でも設定でき、繰り返しの仕方は自由に決められます。また、処理のスキップや中断等もでき複雑な仕様にも対応することができます。
そんなfor文について本記事では解説していくので一緒に学んでいきましょう。
目次
1.for文とは
for文は繰り返し処理を行うための命令文です。
具体的には、「要素 in イテレータ」という形の引数を取り、イテレータという複数要素があるものを順番に一つずつ取り出し、繰り返していく処理です。
2.Kotlinにおけるfor文のサンプル
この章ではKotlinにおけるfor文の書き方からfor文の制御方法までお伝えします。
2-1.宣言方法
まず基本的なKotlinでのfor文の記述にいて解説します。以下の様に引数へRangeオブジェクト(例:1..5)を使用して任意の数値の幅(例:1~5)を取って、その1つ1つの要素を入れる変数(例:cnt)を定義します。そしてfor文のブロック内に繰り返したい処理を記述します。
for (cnt in 1..5) { println("${cnt}:こんにちは") }
実行結果
1:こんにちは ~(省略)~ 5:こんにちは
※Kotlinでのfor文はJavaとは異なりfor(初期化式;条件式;更新式)の形式は利用できないので注意してください。
以後の章で更新する際の刻み方を変える方法等を解説します。
2-2.要素を逆順に繰り返す方法
要素を逆順に取り出すには以下のようなキーワードを利用します。それぞれの型毎に文やメソッドを利用することで行なえます。基本的には“downTo”を利用して初期値と最終値を設定することでカウントの逆順が設定できます。
// 基本downTo(逆順) for (cnt in 5 downTo 1) { println("${cnt}:こんにちは") } // Rengeオブジェクト for (cnt in (1..5).reversed()) { println("${cnt}:こんにちは") } // Arrayオブジェクト val array = arrayOf(1, 2, 3, 4, 5) for (cnt in array.reversedArray()) { println("${cnt}:こんにちは") } // Listオブジェクト val list = listOf(1, 2, 3, 4, 5) for (cnt in list.reversed()) { println("${cnt}:こんにちは") }
実行結果
5:こんにちは ~(省略)~ 1:こんにちは ~(省略)~
2-3.繰り返しの刻み方を変える方法
刻み方を設定するには“step”という文を利用します。初期値(例:2)から始まって刻みの分(例:2)足された次の数で再びループされて、これを繰り返します。
// step(刻み) for (twoStep in 2..10 step 2) { println(twoStep) }
実行結果
2 4 6 8 10
2-4.配列やListを繰り返すのに便利なもの
配列やListでは以下の様に、”until”を使用して配列の数より一つ少ない数分だけ回して、配列の添え字に設定する値として使用することができます。”indicis”を使用してリストの要素を一つづつ取り出すことができます。”withIndex”を使用して配列の場所の番号とリストの要素の中身を直接変数として取り出すこともできます。for文でmapを変数に取り出す際には分割代入の機能を利用して、キー項目と値を取り出す事ができます。
// until val yamatoCnt1 = arrayOf("ひとつ", "ふたつ", "みっつ", "よっつ", "いつつ") for (index in 0 until yamatoCnt1.size) { println("$index:${index + 1}=${yamatoCnt1[index]}") } // .indicis val yamatoCnt2 = listOf("ひと", "とお", "もも", "ち", "よろず") for (index in yamatoCnt2.indices) { println("$index:${10.toDouble().pow(index)}=${yamatoCnt2[index]}") } // withIndex for ((index, yamatoName) in yamatoCnt2.withIndex()) { println("$index:${10.toDouble().pow(index)}=$yamatoName") } val yamatoCnt3 = mapOf("ひと" to 1, "とお" to 10, "もも" to 100, "ち" to 1000, "よろず" to 10000) for ((key, value) in yamatoCnt3) { println("$value=$key") }
実行結果
0:1=ひとつ 1:2=ふたつ 2:3=みっつ 3:4=よっつ 4:5=いつつ 0:1.0=ひと 1:10.0=とお 2:100.0=もも 3:1000.0=ち 4:10000.0=よろず ~省略~ 1=ひと 10=とお 100=もも 1000=ち 10000=よろず
2-5.繰り返しの制御文
for文の制御できる文は二つあります。1つはcontinue文です。これはforループをその時点から再びやり直す処理になります。もう1つはbreakb文です。これはforループをその時点で抜ける処理になります。
val ajiaCityMap = mapOf("東京" to true, "大阪" to false, "ソウル" to true, "釜山" to false, "ハノイ" to true, "ホーチミン" to false) for ((cityName, capital) in ajiaCityMap) { if (!capital) continue println("首都:$cityName") } val siteName = "EngineerClub" for (char in siteName.toCharArray()) { if (char == 'C') break print(char) }
実行結果
首都:東京 首都:ソウル 首都:ハノイ
またcontinue文、for文共にラベルを付けて2階層以上外のループにも再開場所、抜ける場所を指定することができます。処理順序が自由に決められてしまうため、使用は推奨されませんが紹介だけ行っておきます。
print("*") start@ for (i in 2..5) { println() for (j in 1..i) { print("*") if (i == 3) continue@start if (i == 5) break@start } }
実行結果
* ** * **** *
3.その他Kotlinのループ処理のサンプル
for文以外にもループ処理を行う文はありますのでここで軽く紹介します。
3-1.forEach文とは
KotlinでのforEach文の記述にいて解説します。コレクション(配列やList)やシーケンスに対してループ処理を行うことができます。for文と違って刻み方の設定やcontinue文、break文の処理は行えないので注意しましょう。またfoeEachIndex文を使用すれば、コレクション等の位置を取り出すことができます。
val list = listOf("りんご", "みかん", "バナナ") list.forEach { println(it) } list.asSequence().forEach { println(it) } list.forEachIndexed { index, value -> println("$index:$value") } list.asSequence().forEachIndexed { index, value -> println("$index:$value") }
実行結果
りんご みかん バナナ ~省略~ 0:りんご 1:みかん 2:バナナ ~省略~
3-2.while文とは
while文の記述にいて解説します。これは最初にループ処理を行うか否かの真理値を取ります。またcontinue文やbreak文も使用する事ができます。
var index = 0 while (index < 5) { println(index) index++ } println("ループ終了")
実行結果
0 1 2 3 4 ループ終了
for文同様continue文、for文共にラベルを付けて2階層以上外のループにも再開場所、抜ける場所を指定することができます。処理順序が自由に決められてしまうため、使用は推奨されませんが紹介だけ行っておきます。
end@ while (true) { devLang@ while (true) { println("開発で使うおすすめの言語は?") println("1.様々な端末で動かしたい,2.AIを使いたい,3.組み込みたい,4.データを抽出したい,n.次へ,q.終了") val select: String = readLine()!! when (select) { "1" -> { println("Kotlin/Java"); continue@devLang } "2" -> { println("Python"); continue@devLang } "3" -> { println("C++/C"); continue@devLang } "4" -> { println("SQL"); continue@devLang } "n" -> { println("next"); break@devLang } "q" -> { println("quit"); break@end } else -> println("入力エラー") } } devEnv@ while (true) { println("おすすめの開発環境は?") println("1.Kotlin/Javaを使いたい,2.JavaScriptを使いたい,n.次へ,q.終了") val select: String = readLine()!! when (select) { "1" -> { println("IntelliJ/Eclipse"); continue@devEnv } "2" -> { println("VSCode"); continue@devEnv } "n" -> { println("next"); continue@end } "q" -> { println("quit"); break@end } } } }
実行結果
開発で使うおすすめの言語は? 1.様々な端末で動かしたい,2.AIを使いたい,3.組み込みたい,4.データを抽出したい,n.次へ,q.終了 1 Kotlin/Java 開発で使うおすすめの言語は? 1.様々な端末で動かしたい,2.AIを使いたい,3.組み込みたい,4.データを抽出したい,n.次へ,q.終了 n next おすすめの開発環境は? 1.Kotlin/Javaを使いたい,2.JavaScriptを使いたい,n.次へ,q.終了 1 IntelliJ/Eclipse おすすめの開発環境は? 1.Kotlin/Javaを使いたい,2.JavaScriptを使いたい,n.次へ,q.終了 n next 開発で使うおすすめの言語は? 1.様々な端末で動かしたい,2.AIを使いたい,3.組み込みたい,4.データを抽出したい,n.次へ,q.終了 q quit
3-3.do-while文とは
do-while文について解説します。これは最後にループ処理を行うか否かの真理値を取ります。またcontinue文やbreak文も使用する事もラベルを使用する事もできます。Kotlinならではの特徴としてはdo-whileに囲まれたブロックで宣言された変数がwhileの引数として取れます。
do { val ans = readLine()!! } while (ans != "end") println("処理を抜けました")
実行結果
1 end 処理を抜けました
4.さいごに
ここまで紹介した機能を使えば様々な要件に処理を合わせることができると思います。For文を使用する事で冗長になりがちな処理を繰り返し処理にすることができるので、ここで学んだことをぜひご活用ください。
コメント