TypeScriptの繰り返し文
この記事ではTypeScriptの繰り返し文について説明します。
YouTube Video
TypeScriptにおけるfor文
TypeScriptにおけるfor
文は、繰り返し処理を行うための基本的なループ構文です。for
文では、指定された回数や条件に基づいて、同じブロックのコードを繰り返し実行できます。
基本構文
1for (initialization; condition; update) {
2 // Code to execute repeatedly while the condition is true
3}
- 初期化(
initialization
): ループを開始する前に一度だけ実行される部分です。ループカウンターなどの変数を初期化します。 - 条件(
condition
): ループを続けるかどうかを判断する条件です。true
であればループを続け、false
であれば終了します。 - 更新(
update
): 各ループの終わりに実行され、ループカウンターを更新します。
例1: 基本的なfor
ループ
以下の例では、0
から4
までの数字を順番に出力します。
1for (let i = 0; i < 5; i++) {
2 console.log("The value of i is: " + i);
3}
4// Outputs:
5// The value of i is: 0
6// The value of i is: 1
7// The value of i is: 2
8// The value of i is: 3
9// The value of i is: 4
例2: 配列を使ったfor
ループ
配列の要素を順番に処理するために、for
文を使うこともできます。
1let fruits: string[] = ["apple", "banana", "cherry"];
2
3for (let i = 0; i < fruits.length; i++) {
4 console.log("Fruit: " + fruits[i]);
5}
6// Outputs:
7// Fruit: apple
8// Fruit: banana
9// Fruit: cherry
例3: for-in
ループ
for-in
ループは、オブジェクトのプロパティや配列のインデックスを順番に取得するために使用されます。
1let car = { brand: "Toyota", model: "Corolla", year: 2020 };
2
3for (let key in car) {
4 console.log(key + ": " + car[key]);
5}
6// Outputs:
7// brand: Toyota
8// model: Corolla
9// year: 2020
例4: for-of
ループ
for-of
ループは、配列や文字列などのイテラブルオブジェクトから、各要素の値を順に取得するために使用されます。
1let colors: string[] = ["red", "green", "blue"];
2
3for (let color of colors) {
4 console.log("Color: " + color);
5}
6// Outputs:
7// Color: red
8// Color: green
9// Color: blue
例5: ネストされたfor
ループ
for
ループを他のfor
ループの中で使用する、いわゆるネストされたループも可能です。これにより、二重ループなどを実現できます。
1for (let i = 0; i < 3; i++) {
2 console.log("Outer loop i: " + i);
3 for (let j = 0; j < 2; j++) {
4 console.log(" Inner loop j: " + j);
5 }
6}
7// Outputs:
8// Outer loop i: 0
9// Inner loop j: 0
10// Inner loop j: 1
11// Outer loop i: 1
12// Inner loop j: 0
13// Inner loop j: 1
14// Outer loop i: 2
15// Inner loop j: 0
16// Inner loop j: 1
まとめ
for
文は、指定した回数や条件で繰り返し処理を行います。for-in
はオブジェクトのプロパティや配列のインデックスを取得するのに使います。for-of
は配列などのイテラブルオブジェクトから要素の値を取得します。- ネストされた
for
ループで複雑な繰り返し処理も可能です。
TypeScriptのfor
文は、他のループと同様に強力で柔軟な繰り返し処理を提供します。
TypeScriptにおけるwhile文
TypeScriptにおけるwhile
文は、指定された条件がtrue
である間、繰り返し処理を実行するためのループ構文です。for
ループと似ていますが、while
ループはあらかじめ反復回数が決まっていない場合や、条件によって繰り返しの制御を行いたい場合に適しています。
基本構文
1while (condition) {
2 // Code to execute repeatedly while the condition is true
3}
- 条件: ループを実行する条件。この条件が
true
の間はループが続行され、false
になるとループが終了します。
例1: 基本的なwhile
ループ
以下の例では、i
が5未満である間、i
の値を出力し続けます。
1let i: number = 0;
2
3while (i < 5) {
4 console.log("The value of i is: " + i);
5 i++;
6}
7// Outputs:
8// The value of i is: 0
9// The value of i is: 1
10// The value of i is: 2
11// The value of i is: 3
12// The value of i is: 4
この例では、i
が5以上になると条件がfalse
になるため、ループが終了します。
例2: 無限ループの例
while
ループで条件が常にtrue
の場合、無限ループになることがあります。これは通常、プログラムが意図せず停止しなくなる原因となるため、注意が必要です。
1let x: number = 0;
2
3while (true) {
4 console.log("The value of x is: " + x);
5 x++;
6 if (x >= 5) {
7 break; // Exit the loop when the condition is met
8 }
9}
10// Outputs:
11// The value of x is: 0
12// The value of x is: 1
13// The value of x is: 2
14// The value of x is: 3
15// The value of x is: 4
break
文を使用して、条件を満たしたらループを強制的に終了することができます。
例3: do-while
ループ
do-while
ループは、少なくとも一度は必ずループの処理が実行される構造です。条件の評価が処理の後で行われるため、条件がfalse
でも最初の1回は処理が実行されます。
1let j: number = 5;
2
3do {
4 console.log("The value of j is: " + j);
5 j++;
6} while (j < 5);
7// Outputs: The value of j is: 5
この例では、j
が最初から5
で、j < 5
がfalse
ですが、do-while
ループでは最初の1回は条件に関係なく実行されます。
まとめ
while
ループは、条件がtrue
である限り処理を繰り返します。- ループの終了条件が曖昧な場合、無限ループに注意する必要があります。
do-while
ループは、少なくとも1回は処理が実行される点で通常のwhile
ループと異なります。
TypeScriptのwhile
文は、反復回数が不定なループ処理や、動的に条件をチェックする必要がある場面で役立ちます。
break
とcontinue
ループ内でbreak
とcontinue
を使えます。
break
は、ループを途中で終了するために使います。continue
は、現在の反復をスキップして、次の反復に進みます。
break
の例
1for (let i = 0; i < 10; i++) {
2 if (i === 5) {
3 break; // Exits the loop when i is 5
4 }
5 console.log(i);
6}
7// Outputs 0, 1, 2, 3, 4
8
9let i = 0;
10while (i < 10) {
11 if (i === 5) {
12 break; // Ends the loop when i is 5
13 }
14 console.log(i);
15 i++;
16}
17// Outputs 0, 1, 2, 3, 4
この場合、i
が5になるとbreak
が実行されます。結果として、0
から4
までが表示されます。
continue
の例
1for (let i = 0; i < 5; i++) {
2 if (i === 2) {
3 continue; // Skips when i is 2
4 }
5 console.log(i);
6}
7// Outputs 0, 1, 3, 4
8
9let i = 0;
10while (i < 5) {
11 if (i === 2) {
12 i++;
13 continue; // Skips when i is 2
14 }
15 console.log(i);
16 i++;
17}
18// Outputs 0, 1, 3, 4
この場合、i
が2
の時にcontinue
が実行されます。結果として、2
以外の数値が表示されます。
TypeScriptにおける入れ子ループ
入れ子ループとは、1つのループの内部で別のループを使う構造のことです。TypeScriptでは、for
、while
、do-while
といったループ構文がサポートされています。入れ子ループを使用することで、例えば2次元配列(マトリックス)を処理したり、複数の条件に基づく処理を効率化することができます。
基本構文
入れ子ループの基本的な構文は次の通りです。
1for (let i: number = 0; i < n; i++) {
2 for (let j: number = 0; j < m; j++) {
3 // Processing for the inner loop
4 }
5}
外側のループが1度実行されるたびに、内側のループがすべての繰り返しを完了します。この構造は多重ループやデータ構造を扱うときに非常に便利です。
TypeScriptでの入れ子ループの例
2次元配列の走査
入れ子ループは2次元配列のような多次元データ構造を操作する場合によく使用されます。次の例では、2次元配列の要素を走査し、その値をコンソールに表示します。
1const matrix: number[][] = [
2 [1, 2, 3],
3 [4, 5, 6],
4 [7, 8, 9]
5];
6
7for (let row: number = 0; row < matrix.length; row++) {
8 for (let col: number = 0; col < matrix[row].length; col++) {
9 console.log(`matrix[${row}][${col}] = ${matrix[row][col]}`);
10 }
11}
12// Output
13// matrix[0][0] = 1
14// matrix[0][1] = 2
15// matrix[0][2] = 3
16// matrix[1][0] = 4
17// matrix[1][1] = 5
18// matrix[1][2] = 6
19// matrix[2][0] = 7
20// matrix[2][1] = 8
21// matrix[2][2] = 9
この例では、2次元配列 matrix
を走査しています。外側のループは行(row)を、内側のループは列(col)を担当し、各要素を順番に表示しています。
2つの配列の組み合わせ
次に、2つの配列のすべての組み合わせを計算する場合の例を紹介します。例えば、2つの配列からそれぞれの要素を1つずつ取り出して、可能なすべてのペアを出力することができます。
1const array1: string[] = ['A', 'B', 'C'];
2const array2: number[] = [1, 2, 3];
3
4for (let i: number = 0; i < array1.length; i++) {
5 for (let j: number = 0; j < array2.length; j++) {
6 console.log(`Pair: (${array1[i]}, ${array2[j]})`);
7 }
8}
9// Output
10// Pair: (A, 1)
11// Pair: (A, 2)
12// Pair: (A, 3)
13// Pair: (B, 1)
14// Pair: (B, 2)
15// Pair: (B, 3)
16// Pair: (C, 1)
17// Pair: (C, 2)
18// Pair: (C, 3)
この例では、文字列配列 array1
と数値配列 array2
のすべてのペアを作成しています。外側のループで array1
の要素を、内側のループで array2
の要素をそれぞれ取り出し、ペアを表示しています。
三重ループでの座標の生成
三重の入れ子ループを使用することで、例えば3次元空間上の座標を生成することができます。
1for (let x: number = 0; x < 3; x++) {
2 for (let y: number = 0; y < 3; y++) {
3 for (let z: number = 0; z < 3; z++) {
4 console.log(`Coordinate: (${x}, ${y}, ${z})`);
5 }
6 }
7}
8// Output
9// Coordinate: (0, 0, 0)
10// Coordinate: (0, 0, 1)
11// Coordinate: (0, 0, 2)
12// ...
13// Coordinate: (2, 2, 1)
14// Coordinate: (2, 2, 2)
このように、三重の入れ子ループを使うと3次元空間上の座標を簡単に生成できます。
入れ子ループのパフォーマンス
入れ子ループは便利ですが、ループの深さが増えるほど計算量が急激に増加します。例えば、n
回の外側ループと m
回の内側ループがある場合、全体の繰り返し回数は n * m
回となります。これがさらに多重の入れ子になると、計算量は指数的に増加し、プログラムのパフォーマンスに影響を与える可能性があります。
以下に、3つの配列を走査する場合の計算量を示します。
1const array1: number[] = [1, 2, 3];
2const array2: number[] = [4, 5, 6];
3const array3: number[] = [7, 8, 9];
4
5for (let i: number = 0; i < array1.length; i++) {
6 for (let j: number = 0; j < array2.length; j++) {
7 for (let k: number = 0; k < array3.length; k++) {
8 console.log(`Combination: (${array1[i]}, ${array2[j]}, ${array3[k]})`);
9 }
10 }
11}
この場合、array1
、array2
、array3
のそれぞれの長さを掛け合わせた回数の繰り返しになり、すべての組み合わせを処理するために合計27
回の繰り返しが発生します。
入れ子ループの最適化
入れ子ループを使用するときは、次のような最適化を考慮することで、パフォーマンスを改善できます。
- 早期リターンの導入: 目的が達成された場合にループから早期に抜けることで、不要な繰り返しを避けます。
- ループ変数のキャッシング: ループ内で使用する変数の値(特に長さや範囲など)をあらかじめキャッシュすることで、毎回計算するコストを削減できます。
- データ構造の変更: 特定の繰り返し処理を高速化するために、配列やオブジェクトの構造を見直すことも有効です。
結論
入れ子ループは、複雑なデータ処理やアルゴリズムにおいて強力なツールです。しかし、ループの深さや繰り返し回数が増えると、パフォーマンスの問題が発生する可能性があります。適切な最適化と注意深い設計を行うことで、TypeScriptにおける入れ子ループを効果的に活用できるでしょう。
YouTubeチャンネルでは、Visual Studio Codeを用いて上記の記事を見ながら確認できます。 ぜひYouTubeチャンネルもご覧ください。