Java超|配列のlengthと繰り返し処理

配列の数は、Javaに聞けばいい。
lengthを使いこなすと、配列の大きさが変わっても、ループが自然に最後まで巡回できる。

配列は、同じ型のデータをまとめて扱うための便利な仕組みです。

たとえば、5日分の修行時間、戦士たちの訓練回数、1週間分の巡回記録、補給品の残数など、同じ種類の値が並ぶ場面では、配列を使うとデータを整理しやすくなります。

ただし、配列を使うときには、もう1つとても大切な考え方があります。

それが length です。

length は、配列が持っている要素数を表します。
つまり、「この配列には箱が何個あるのか」をJavaに教えてもらうための情報です。

これまでの配列のプログラムでは、for文の条件に 5 のような固定の数字を書くことがありました。

for(int i = 0; i < 5; i++){
    処理;
}

この書き方でも、要素数が5個の配列なら正しく動きます。

しかし、あとで配列の要素数が7個や10個に増えた場合、for文の条件も一緒に書き直さなければなりません。
もし書き直しを忘れると、増えた分のデータが処理されないことがあります。

そこで役立つのが length です。

for(int i = 0; i < 配列変数名.length; i++){
    処理;
}

このように書くと、配列の要素数に合わせて、繰り返し回数を自然に調整できます。

ドラゴンボール風にたとえると、配列は「戦士たちの修行記録札が並んだ訓練棚」です。
length は、その棚に「記録札が何枚あるのか」を教えてくれるスカウターのようなものです。

5枚なら5。
7枚なら7。
10枚なら10。

棚の大きさをJavaが確認してくれるので、巡回役のfor文は、その枚数ぶんだけ自然に動けます。

この記事では、配列の長さとは何か、length の使い方、固定の数字を書く方法との違い、for文と組み合わせると便利な理由を、Sample7.java と Sample8.java を使って整理していきます。

配列の長さとは何か

配列には、あらかじめ「何個の要素を持っているか」が決まっています。

この要素の数を、配列の長さといいます。

たとえば、次のような配列があるとします。

int[] reading = {30, 45, 20, 50, 35};

この配列には、5つの整数が入っています。

添字値
030
145
220
350
435

この場合、配列の長さは 5 です。

ここで大切なのは、最後の添字は 4 だけれど、配列の長さは 5 だという点です。

項目値
要素数5
length の値5
最初の添字0
最後の添字4

Javaの配列では、添字は 0 から始まります。

そのため、要素数が5個なら、添字は 0、1、2、3、4 になります。

ドラゴンボール風にたとえると、5つの修行記録箱がある棚では、箱の番号札は0番から4番までです。

箱は5個あります。
でも、最後の番号は4番です。

length は「最後の番号」ではありません。
length は「箱が全部で何個あるか」を表します。

length は配列の要素数を表す

Javaでは、配列変数のあとに .length を付けると、その配列の要素数を表せます。

基本の形は次の通りです。

配列変数名.length

たとえば、reading という配列なら、次のように書きます。

reading.length

これは、reading 配列が持っている要素数を表します。

書き方表すもの
reading[0]添字0の要素
reading[1]添字1の要素
reading[2]添字2の要素
reading.lengthreading 配列全体の要素数

reading[0] のような書き方は、配列の中の1つの値を取り出します。

一方、reading.length は、配列全体の大きさを表します。

ここは混同しやすいところです。

書き方見ているもの
配列変数名[添字]指定した場所の値
配列変数名.length配列の要素数

ドラゴンボール風にたとえると、reading[0] は「0番の修行記録箱の中身を見る」ことです。

reading.length は「修行記録箱が全部で何個あるかを確認する」ことです。

中身を見るのか。
箱の数を確認するのか。

この違いを分けて考えると、length の役割がぐっと分かりやすくなります。

length は最後の添字ではない

length を学ぶときに特に注意したいのは、length は最後の添字ではないという点です。

たとえば、要素数が5個の配列なら、length の値は 5 です。

しかし、使える添字は 0 から 4 までです。

配列の要素数length の値使える添字最後の添字
330, 1, 22
550, 1, 2, 3, 44
770, 1, 2, 3, 4, 5, 66

この表から分かるように、最後の添字は length - 1 です。

要素数が5なら、最後の添字は 5 - 1 で 4 です。
要素数が7なら、最後の添字は 7 - 1 で 6 です。

ドラゴンボール風にたとえると、修行記録箱が5個ある棚では、箱の番号が0番から始まるため、最後の箱は4番になります。

length は「5個ある」という数です。
最後の添字は「4番」です。

この2つを同じものだと思わないことが大切です。

図:lengthは要素数、最後の添字はlength - 1

この図が示していること

この図では、reading 配列に5個の要素があることを示しています。

箱の上には 0、1、2、3、4 という添字が付いています。
配列の長さは5なので、reading.length の値は 5 です。

ここから分かることは、length は「箱の数」を表しているということです。

一方、最後の添字は 4 です。

つまり、要素数が5個の配列では、length は 5、最後の添字は length - 1 の 4 になります。

この違いを押さえておくと、for文で配列を安全に処理しやすくなります。

length の基本を確認する

まずは、配列の長さを表示する基本的なプログラムを見ていきます。

ここでは、5日分の精神修行時間を配列に入れて、順番に表示します。
最後に、配列の length を使って、記録が何日分あるのかも表示します。

ファイル名:Sample7.java

class Sample7
{
    public static void main(String[] args)
    {
        int[] reading = {30, 45, 20, 50, 35};   // 5日分の精神修行時間を用意する

        for(int i = 0; i < 5; i++){
            System.out.println((i + 1) + "日目の精神修行時間は " +
                               reading[i] + "分です。");
        }

        System.out.println("精神修行記録は全部で " + reading.length +
                           "日分あります。");   // 配列の長さを表示する
    }
}

実行結果は次のようになります。

1日目の精神修行時間は 30分です。
2日目の精神修行時間は 45分です。
3日目の精神修行時間は 20分です。
4日目の精神修行時間は 50分です。
5日目の精神修行時間は 35分です。
精神修行記録は全部で 5日分あります。

このプログラムでは、reading 配列に5個の値が入っています。

添字値
030
145
220
350
435

そして、最後の表示で reading.length を使っています。

System.out.println("精神修行記録は全部で " + reading.length +
                   "日分あります。");

reading 配列には5個の要素があるため、reading.length は 5 になります。

そのため、実行結果では 5日分あります と表示されます。

reading.length が表しているもの

Sample7.java では、reading.length は配列の要素数を表しています。

int[] reading = {30, 45, 20, 50, 35};

この配列には、値が5個並んでいます。

値の並び要素数
30, 45, 20, 50, 355

そのため、reading.length の値は 5 です。

ここで、reading[i] と reading.length の違いを整理しておきましょう。

書き方意味
reading[i]添字 i の要素の値
reading.lengthreading 配列の要素数

reading[i] は、配列の中身を見ています。
reading.length は、配列の大きさを見ています。

ドラゴンボール風にたとえると、reading[i] は「i番の修行記録札を読む」ことです。
reading.length は「修行記録札が全部で何枚あるかを確認する」ことです。

中身の値と、箱の数は別物です。

Sample7.java ではfor文に固定の数字を使っている

Sample7.java の for文 では、条件に 5 が直接書かれています。

for(int i = 0; i < 5; i++){
    System.out.println((i + 1) + "日目の精神修行時間は " +
                       reading[i] + "分です。");
}

この配列は要素数が5個なので、i < 5 でも正しく動きます。

i は次のように変化します。

i の値i < 5扱う要素
0truereading[0]
1truereading[1]
2truereading[2]
3truereading[3]
4truereading[4]
5false処理しない

この形なら、reading[0] から reading[4] までを順番に表示できます。

ただし、もしあとで reading 配列の要素数が変わった場合、for文の 5 も書き直す必要があります。

ここが固定の数字を書く方法の注意点です。

固定の数字を書くと修正が必要になる

for文の条件に固定の数字を書く方法は、最初は分かりやすいです。

for(int i = 0; i < 5; i++){
    System.out.println(reading[i]);
}

しかし、あとで配列の要素数が変わると、困ることがあります。

たとえば、精神修行記録を5日分から7日分に増やしたとします。

int[] reading = {30, 45, 20, 50, 35, 40, 25};

このとき、for文が i < 5 のままだと、最初の5個しか表示されません。

配列の要素数for文の条件結果
5i < 55個すべて表示できる
7i < 5最初の5個しか表示されない
10i < 5最初の5個しか表示されない

配列の中身を増やしたのに、for文の条件を直し忘れると、一部のデータが処理されなくなります。

ドラゴンボール風にたとえると、修行記録札が7枚に増えているのに、巡回役の戦士が「5枚だけ確認する」と決めたまま動いている状態です。

6枚目と7枚目の記録札は確認されません。

length を使うとfor文が配列に合わせて動く

固定の数字を書く代わりに、for文の条件に length を使うと、配列の要素数に合わせて自然に繰り返せます。

for(int i = 0; i < reading.length; i++){
    System.out.println(reading[i]);
}

この書き方では、reading 配列の要素数がそのまま繰り返し条件に使われます。

reading の要素数reading.lengthループ回数
555回
777回
101010回

配列の要素数が変わっても、for文の条件を直す必要がありません。

配列の大きさをJavaが見て、その分だけループしてくれます。

ドラゴンボール風にたとえると、巡回役の戦士が、訓練棚にある記録札の枚数をスカウターで確認してから、全員分を見て回るようなものです。

5枚なら5枚。
7枚なら7枚。
10枚なら10枚。

棚の大きさに合わせて自然に巡回できます。

for文の条件に length を使う

次に、for文の条件に length を使ったプログラムを見ていきます。

ここでは、神殿の仙豆畑に水やりした回数を配列に入れ、配列の長さに合わせて表示します。

ファイル名:Sample8.java

class Sample8
{
    public static void main(String[] args)
    {
        int[] watering = {1, 2, 1, 3, 2};

        for(int i = 0; i < watering.length; i++){   // 配列の長さを使って繰り返す
            System.out.println((i + 1) + "日目の仙豆畑の水やり回数は " +
                               watering[i] + "回です。");
        }

        System.out.println("水やり記録の日数は " + watering.length +
                           "日です。");
    }
}

実行結果は次のようになります。

1日目の仙豆畑の水やり回数は 1回です。
2日目の仙豆畑の水やり回数は 2回です。
3日目の仙豆畑の水やり回数は 1回です。
4日目の仙豆畑の水やり回数は 3回です。
5日目の仙豆畑の水やり回数は 2回です。
水やり記録の日数は 5日です。

このプログラムでは、for文の条件に watering.length を使っています。

for(int i = 0; i < watering.length; i++){
    System.out.println((i + 1) + "日目の仙豆畑の水やり回数は " +
                       watering[i] + "回です。");
}

watering 配列には5個の値が入っているため、watering.length は 5 です。

そのため、i は 0 から 4 まで変化します。

i の値条件 i < watering.length扱う要素
0truewatering[0]
1truewatering[1]
2truewatering[2]
3truewatering[3]
4truewatering[4]
5false処理しない

このように、i < watering.length と書くと、存在する要素だけを安全に順番に処理できます。

図:for文でlengthを使うと配列の最後まで自然に処理できる

この図が示していること

この図では、watering.length が 5 であるため、for文の条件 i < watering.length によって、i が 0 から 4 まで変化することを示しています。

i が 0 のときは watering[0] を処理します。
i が 1 のときは watering[1] を処理します。
同じように進み、i が 4 のときに watering[4] を処理します。

そのあと i が 5 になると、i < watering.length は false になります。

そのため、存在しない watering[5] には進みません。

ここから分かることは、length を使うことで、配列の範囲を超えずに、存在する要素だけを順番に処理できるということです。

length を使うと要素数の変更に強くなる

length の大きな利点は、配列の要素数が変わっても、for文を直さずに済みやすいことです。

たとえば、Sample8.java の watering 配列を、5日分から7日分に増やしたとします。

int[] watering = {1, 2, 1, 3, 2, 2, 1};

この場合、watering.length は 7 になります。

for文が次のようになっていれば、i は 0 から 6 まで進み、7個すべての要素を処理できます。

for(int i = 0; i < watering.length; i++){
    処理;
}
配列の中身watering.length処理される添字
1, 2, 1, 3, 250から4
1, 2, 1, 3, 2, 2, 170から6

もし for文の条件が i < 5 のままだと、7個あるのに最初の5個しか処理されません。

書き方要素数が7個になったとき
i < 5最初の5個だけ処理する
i < watering.length7個すべて処理する

ドラゴンボール風にたとえると、仙豆畑の水やり記録が5日分から7日分に増えても、length を使っていれば、記録札の枚数に合わせて全部確認できます。

固定の数字だけで巡回していると、増えた分を見落とすことがあります。

固定の数字とlengthの違い

for文で固定の数字を使う方法と、length を使う方法を比べてみましょう。

書き方特徴
i < 5要素数が変わると修正が必要
i < 配列変数名.length要素数が変わっても対応しやすい

固定の数字を使う場合、その数字が何を意味しているのか、あとから見たときに分かりにくいことがあります。

for(int i = 0; i < 5; i++){
    System.out.println(watering[i]);
}

この 5 は、配列の要素数を表しているのか、別の意味の数なのか、コードが長くなるほど判断しづらくなります。

一方、length を使うと、配列の長さに合わせて処理していることがはっきりします。

for(int i = 0; i < watering.length; i++){
    System.out.println(watering[i]);
}

この書き方なら、「watering 配列の要素数ぶん繰り返している」とすぐに分かります。

観点固定の数字length
意味の分かりやすさ数字だけでは意味が見えにくい配列の長さだと分かりやすい
要素数変更への強さ修正が必要修正が少なくて済む
ミスの起きにくさ修正漏れが起きやすい配列に合わせて動きやすい
読みやすさ数字の意味を考える必要がある意図が伝わりやすい

length を使うと、配列の大きさに合わせたループであることが読み手にも伝わりやすくなります。

length を使うと修正が楽になる

プログラムでは、あとからデータの数を変えたくなることがよくあります。

変更例起こりやすい修正
5日分の記録を7日分にする配列の値を増やす
3人分の点数を6人分にする配列の要素数を増やす
1週間分を1か月分にするデータ数が大きく変わる
補給品の種類を増やす配列の中身が増える

このとき、for文の条件に固定の数字が書かれていると、その数字も一緒に修正する必要があります。

しかし、length を使っていれば、配列の中身を変えるだけで、繰り返し回数も自動的に変わります。

これは、保守しやすいコードを書くうえでとても大切です。

ドラゴンボール風にたとえると、任務記録が増えるたびに巡回回数を手書きで直すのは大変です。

length を使えば、訓練棚の記録札の枚数を確認して巡回できるため、記録が増えても自然に対応できます。

length を使うときの基本形

配列を最初から最後まで処理したいときは、次の形を基本として覚えておくと便利です。

for(int i = 0; i < 配列変数名.length; i++){
    配列変数名[i] を使った処理;
}

この形では、i は 0 から 配列変数名.length - 1 まで変化します。

たとえば、watering.length が 5 なら、i は 0、1、2、3、4 と変化します。

これは、watering 配列で使える添字とぴったり一致します。

for文の部分役割
int i = 0最初の添字 0 から始める
i < 配列変数名.length配列の要素数より小さい間だけ続ける
i++次の添字へ進む
配列変数名[i]現在の添字の要素を扱う

この形は、配列を使うJavaプログラムで何度も登場します。

ドラゴンボール風にたとえると、i は巡回番号です。
i が 0 なら0番の記録札、i が 1 なら1番の記録札を確認します。

そして、i が length と同じ値になる前に止まるため、存在する記録札だけを安全に確認できます。

i < 配列名.length と書く理由

for文では、i <= 配列名.length ではなく、i < 配列名.length と書くのが基本です。

理由は、添字が0から始まるからです。

たとえば、要素数が5個の配列では、使える添字は 0 から 4 です。

i の条件i の値結果
i < 50, 1, 2, 3, 4ちょうど5個を処理できる
i <= 50, 1, 2, 3, 4, 5存在しない添字5まで進んでしまう

i <= 配列名.length と書くと、最後に i が length と同じ値になります。

要素数が5なら、i は 5 になります。

しかし、添字 5 は存在しません。
使える最後の添字は 4 です。

だから、配列を先頭から最後まで処理するときは、次の形が自然です。

i < 配列変数名.length

ドラゴンボール風にたとえると、5個の記録箱がある棚では、0番から4番までを巡回すれば十分です。

5番の箱まで行こうとすると、存在しない箱を探すことになります。

length は配列の中身の値ではない

length は、配列の中に入っている値ではありません。

配列が持っている要素数を表す情報です。

たとえば、次の配列を考えます。

int[] watering = {1, 2, 1, 3, 2};

この配列の中身は、1、2、1、3、2 です。

一方、watering.length は 5 です。

式表すもの値
watering[0]0番の要素1
watering[1]1番の要素2
watering[3]3番の要素3
watering.length要素数5

watering.length は、配列のどこかに入っている 5 を取り出しているわけではありません。

配列そのものが持っている「要素数の情報」を表しています。

ドラゴンボール風にたとえると、watering[0] は0番の記録札の中身です。
watering.length は、記録札が全部で何枚あるかを示す棚の情報です。

札の中身と、棚の枚数は別物です。

図:固定の数字ではなくlengthを使うと変更に強くなる

この図が示していること

この図では、固定の数字を使うfor文と、length を使うfor文の違いを示しています。

左側では、配列の要素が7個あるのに、for文の条件が i < 5 のままです。
そのため、0番から4番までしか処理されず、5番と6番は未処理になります。

右側では、for文の条件に watering.length を使っています。
配列の要素数が7個なら watering.length は 7 になるため、i は 0 から 6 まで進みます。

ここから分かることは、length を使うと配列の要素数が変わっても、最後まで自然に処理しやすいということです。

length を使うと配列の範囲外アクセスを防ぎやすい

配列では、存在しない添字を指定すると問題になります。

たとえば、要素数が5個の配列で使える添字は 0 から 4 までです。

watering[5] は存在しません。

for文で i < watering.length と書くと、i は 0 から 4 までしか進みません。
そのため、配列の範囲外に進みにくくなります。

条件最後に処理される i安全性
i < watering.lengthlength - 1範囲内に収まりやすい
i <= watering.lengthlength範囲外に進む
i < 固定値配列の要素数と合わない可能性がある修正漏れに注意

もちろん、length を使っていても、書き方を間違えれば範囲外になることはあります。

でも、配列全体を先頭から最後まで処理したいときは、i < 配列名.length が安全で読みやすい基本形です。

ドラゴンボール風にたとえると、巡回役の戦士が length を確認して「0番から最後の箱まで」と決めて動くので、存在しない箱へ進みにくくなります。

length は配列処理の土台になる

length は、配列を扱ううえでとても大切です。

配列では、値を入れることや取り出すことだけでなく、「何個あるのか」を知ることも重要です。

length を使うと、次のような処理につなげやすくなります。

処理length の役割
全要素の表示何回ループするかを決める
合計の計算全要素を順番に足す範囲を決める
平均の計算合計を length で割る考え方につながる
最大値の探索最後の要素まで確認する
条件に合う値の検索全要素を調べる範囲を決める

今後、配列の合計、平均、最大値、最小値などを扱うときにも、length はよく使います。

ドラゴンボール風にたとえると、length は「訓練棚に記録札が何枚あるか」を確認するための基本情報です。

札の枚数が分かるからこそ、全員分を表示したり、合計したり、最高記録を探したりできます。

length を使うとコードの意図が伝わりやすくなる

length を使う利点は、修正が楽になることだけではありません。

コードの意味が読み取りやすくなることも大きなメリットです。

for(int i = 0; i < watering.length; i++){
    System.out.println(watering[i]);
}

このコードを見ると、「watering 配列の要素数ぶん繰り返している」とすぐに分かります。

一方、次のように固定の数字だけが書かれていると、5 が何を意味しているのか、少し考える必要があります。

for(int i = 0; i < 5; i++){
    System.out.println(watering[i]);
}
書き方読み手に伝わること
i < 55回繰り返すことは分かるが、配列との関係が見えにくい
i < watering.lengthwatering 配列の長さに合わせていることが分かる

Javaのコードは、自分だけでなく、未来の自分や他の人が読むこともあります。

そのとき、length を使っておくと、意図が伝わりやすくなります。

length を使うときに押さえたいポイント

length を使うときは、次の点を押さえておきましょう。

ポイント内容
length は配列の要素数を表す配列に何個の箱があるかを表す
length は最後の添字ではない最後の添字は length - 1
配列変数名.length と書く配列名のあとに .length を付ける
for文と相性がよい配列の要素数ぶん繰り返しやすい
固定の数字より修正に強い要素数が変わっても対応しやすい
i < 配列名.length が基本0から最後の添字まで安全に進みやすい

特に大切なのは、length と添字の関係です。

配列の長さ最初の添字最後の添字
length0length - 1

この関係が分かっていると、for文の条件も自然に理解できます。

length を使う習慣をつけよう

配列を扱うときは、要素数を固定の数字で書くよりも、できるだけ length を使う習慣をつけると安心です。

もちろん、学習の初期段階では、i < 5 のように固定の数字を使うと動きが見えやすいこともあります。

ただ、配列の要素数に合わせて処理したい場合は、length を使うほうが自然です。

状況おすすめの書き方
配列の要素をすべて処理したいi < 配列名.length
要素数が変わる可能性があるi < 配列名.length
学習用に回数を見せたいだけ固定の数字でもよいことがある
実用的な配列処理を書きたいlength を使うとよい

ドラゴンボール風にたとえると、固定の数字を書く方法は「今日は5枚だけ確認する」と決め打ちする巡回です。

length を使う方法は「棚にある記録札の枚数を確認して、その分だけ巡回する」やり方です。

記録札の枚数が変わっても対応しやすいのは、length を使う方法です。

配列のlengthを理解すると、この先の処理が書きやすくなる

length は、配列を実用的に扱うための大切な土台です。

これから先、配列を使って、合計、平均、最大値、最小値、検索などを学ぶときにも、length は何度も出てきます。

たとえば、全員分の修行時間を合計したいなら、配列の最初から最後まで順番に足していく必要があります。

そのとき、どこまで繰り返すかを決めるのが length です。

for(int i = 0; i < training.length; i++){
    sum += training[i];
}

この形なら、training 配列の要素数がいくつであっても、全要素を順番に処理できます。

ドラゴンボール風にたとえると、length は「修行記録棚の全体を確認するための基本スカウター」です。

何枚の記録札があるか分かるから、全部を巡回できます。
全部を巡回できるから、合計や平均、最高記録の探索へ進めます。

配列を扱うときは、length を「配列の大きさを教えてくれる大切な情報」として意識しておくと、この先のJava学習がかなり楽になります。