repeat()
Kotlinにおいて、同じ処理を繰り返し行う最もシンプルな方法は、おそらく repeat()
を使う方法だと思います。
後に紹介する forループ と異なり、あらかじめ繰り返したい回数が決まっている場合に特に有用です。
repeat()
にはパラメータが2つ指定されており、一つは繰り返したい回数(整数)、もう一つは繰り返したい処理(関数)です。
例えばログにメッセージを繰り返し3回表示させたい場合、次のようになります。
repeat(3, {
println("Print Message 3 times")
})
/**
* Output
*
* Print Message 3 times
* Print Message 3 times
* Print Message 3 times
*/
使い方はシンプルでとても簡単ですね。
repeat()
の最後のパラメータが関数なので、ラムダ式を利用して次のように記述することもできます。
repeat(3) {
println("Print Message 3 times")
}
扱いが難しいポイントは特にないですが、引数を利用してインデックス番号を利用する際は、配列のインデックスと同様に0(ゼロ)から始まるので少し注意が必要です。
repeat(3) { index ->
println("Print Message Index: $index")
}
/**
* Output
*
* Print Message Index: 0
* Print Message Index: 1
* Print Message Index: 2
*/
ちなみに、特定の文字を繰り返すための repeat()
も存在しますが、こちらの repeat()
のパラメータは繰り返す回数(Int)のみで、処理(関数)を繰り返し実行するものではありません。
名称は同じ repeat()
なのですが、使い方も使い道も全く異なるので混同しないようにしておきましょう。
参考までに、特定の文字を繰り返す方の repeat()
の使用例を下に掲載しておきます。
val line = "-".repeat(5)
println(line) // Output: -----
POINT!
- ・repeat()を使うと、指定した回数分、特定の処理を繰り返し実行できる!
- ・第一引数は繰り返しの回数(整数)、第二引数は実行する処理(関数)!
- ・特定の文字を繰り返すための repeat() も存在するので、混同しないように注意!
forループ
Kotlinに限らず、多くのプログラミング言語では ’for’ というキーワードを用いて、ループ(繰り返しの処理)を行うことができるように設計されています。
記述のルールはプログラミング言語によって異なりますが、基本的に for = 繰り返しの処理 と覚えてしまって良いかと思います。
Kotlinでは、繰り返し行いたい回数を指定したい場合は下のようにRange(範囲)を指定します。
for(i in 1..3) {
println("Print Message 3 times")
}
/**
* Output
*
* Print Message 3 times
* Print Message 3 times
* Print Message 3 times
*/
プログラミングを学び始めたばかりの方は、「forループに出てくる “i” って何?なんで “i” なの?」と疑問に思うかもしれませんが、これはプログラミングの世界の慣例のようなものです。
何故 i なのかについては諸説あるようですが、筆者的には、“indexの頭文字の i が由来である” という説がしっくりくるので、それで覚えているというか自分を納得させています。笑
あくまで慣例なので、i と記入しなければならないわけではなく、変数の命名規則に従っていれば何でも良いです。
i を利用してインデックス番号を得ると、ここでは範囲を 1..3
としているので、1〜3までの整数値を得ることができます。
for(i in 1..3) {
println("Print Message Index: $i")
}
/**
* Output
*
* Print Message Index: 1
* Print Message Index: 2
* Print Message Index: 3
*/
また、forループの便利なところは、repeat()
と違ってコレクション(一般的には配列)をループ回数として指定できるところです。
たとえば、names
と定義されたリストの、リストアイテムの数だけ処理を繰り返し行いたければ、in
を使って下のように記述することができます。
val names = listOf("Tom","Marie","Edy")
for(name in names) {
println("$name")
}
/**
* Output
*
* Tom
* Marie
* Edy
*/
names
に含まれるリストのデータ(ここでは文字列)に順番にアクセスして name
に格納し、それが println()
によって出力される …という流れになっています。
変数 name
は i と同様に、name
という名称でなければならないわけではなく、自分やチームが分かりやすいものであれば何でも良いです。
慣例的には、たとえば (item in items) といったように、(単数系 in 複数形) というふうに命名することが多いです。
下に示すように、repeat()
を使っても同じことができますが、forループと比べると若干コードが読みづらくなるというか、直感的に捉えづらくなります。
repeat(names.size) {
println(names[it])
}
/**
* Output
*
* Tom
* Marie
* Edy
*/
ただ、どちらの方が絶対的に良い(正しい)・悪い(間違い)というものではないので、明確な目的があって意図されたコードであれば、どちらでも良いかと思います。
POINT!
- ・forループの範囲を指定することで、任意の回数分、同じ処理を繰り返すことができる!
- ・インデックスは指定した範囲の整数になる(配列番号のように必ずしも0から始まるとは限らない)ので注意!
- ・コレクション(配列)をループ回数として指定することができるのが便利!!
whileループ
最後に紹介するのは、特定の条件を満たすまで処理を繰り返し行いたい場合に使える、whileループです。
たとえば、冒頭で紹介した『アイテムを一度に大量購入する処理』は、このwhileループを使って処理することができます。
whileループでは、( )(かっこ)で指定した条件がtrueである間、繰り返し処理が行われます。
ということは、100個のアイテム購入を処理する場合、所持アイテムの個数が100未満の状態を繰り返しの条件として指定すれば良いことになりますね。
アイテムの所持数を itemCount
、アイテムを一つ購入する処理を getItem()
とすれば、下のように記述することができます。
※プレイヤーの所持金の処理は考えなくて良いものとし、アイテムの個数の初期値は0とします。
var itemCount = 0;
fun getItem() {
itemCount++
}
while(itemCount < 100) {
getItem()
}
println(itemCount) // Output: 100
というわけで、無事に getItem()
を100回も記述せずに済ませることができました。
ちなみに、Kotlinではwhileループの書き方はもう一つあり、do-while
という形があります。
通常のwhileループは条件判定が先に行われるのに対し、do-whileは処理が先に行われます。
なので、最初から while( )
の条件を満たさない場合でも、少なくとも1回は処理が行われることになります。
下のコードでは、既にアイテムを100個所持している状態にして、while()
の条件が満たされないようにしていますが、do{ }
の処理が1回実行され、アイテムの所持数が101個になっていることが確認できます。
var itemCount = 100;
fun getItem() {
itemCount++
}
do {
getItem()
}
while(itemCount < 100)
println(itemCount) // Output: 101
この仕様は、特定の条件を満たす or 満たさないに関係なく、少なくとも1回以上処理が実行されることを保証したい場合などに利用できます。
この記事で紹介したforループとwhileループは、他のプログラミングにも用意されていることが多く、使い方や記述法も似通っています。
なので、ループ処理に関してはKotlinならではの機能・特徴として捉えるよりも、プログラミングの基本形として捉えた方が、プログラミングの理解につながるかもしれません。
まずは身につけたいプログラミング言語をしっかり学んで習得することが大切ですが、ある程度身につけることができたら、他のプログラミング言語も学んでみるのもオススメです。
プログラミング言語間の共通点や違いを発見できて、より深くプログラミングを理解できますよ!😀
POINT!
- ・whileループは、特定の条件を満たすまで繰り返し処理を行う!
- ・do-whileでは、条件を満たさなくても1回は処理が実行される!
- ・ある程度プログラミングに慣れてきたら、他のプログラミングの基本を学んでみるのも良い勉強になる!