「for」ってなんだ? - いまさら聞けないKotlinのなぜ

「for」ってなんだ? – いまさら聞けないKotlinのなぜ

ENGINEER.CLUB編集部

Kotlinのfor(ループ処理)とは、命令を繰り返し処理することのできる便利な記法のことです。繰り返し処理される物は単一値でも複数値でも設定でき、繰り返しの仕方は自由に決められます。また、処理のスキップや中断等もでき複雑な仕様にも対応することができます。

そんなfor文について本記事では解説していくので一緒に学んでいきましょう。

就活生向け特設ページ

1.for文とは

for文は繰り返し処理を行うための命令文です。

具体的には、「要素 in イテレータ」という形の引数を取り、イテレータという複数要素があるものを順番に一つずつ取り出し、繰り返していく処理です。


2.Kotlinにおけるfor文のサンプル

この章ではKotlinにおけるfor文の書き方からfor文の制御方法までお伝えします。

2-1.宣言方法

まず基本的なKotlinでのfor文の記述にいて解説します。以下の様に引数へRangeオブジェクト(:1..5)を使用して任意の数値の幅(:15)を取って、その11つの要素を入れる変数(: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文を使用する事で冗長になりがちな処理を繰り返し処理にすることができるので、ここで学んだことをぜひご活用ください。

私たちは、全てのエンジニアに市場価値を高め自身の望む理想のキャリアを歩んでいただきたいと考えています。もし、今あなたが転職を検討しているのであればこちらの記事をご一読ください。理想のキャリアを実現するためのヒントが見つかるはずです。

『技術力』と『人間力』を高め市場価値の高いエンジニアを目指しませんか?

私たちは「技術力」だけでなく「人間力」の向上をもって遙かに高い水準の成果を出し、関わる全ての人々に感動を与え続ける集団でありたいと考えています。

高い水準で仕事を進めていただくためにも、弊社では次のような環境を用意しています。

  • 定年までIT業界で働くためのスキル(技術力、人間力)が身につく支援
  • 「給与が上がらない」を解消する6ヶ月に1度の明確な人事評価制度
  • 平均残業時間17時間!毎週の稼動確認を徹底しているから実現できる働きやすい環境

現在、株式会社ボールドでは「キャリア採用」のエントリーを受付中です。

まずは以下のボタンより弊社の紹介をご覧いただき、あなたの望むキャリアビジョンをエントリーフォームより詳しくお聞かせください。

コメント

文系IT未経験歓迎!株式会社ボールドの 採用エントリー を受付中!
文系IT未経験歓迎!
株式会社ボールドの 採用エントリー を受付中!