4日目のゴールとテーマ
4日目のテーマは
「配列で“複数のデータ”をまとめて扱い、ループと組み合わせて処理する」 です。
ここまでで、
1つの値(int や String)を変数に入れて扱うことはできるようになりました。
でも、現実のアプリでは「1つ」だけで済むことのほうが少ないです。
テストの点数が5教科分ある
商品が10個ある
ユーザーが何人もいる
こういうときに、
「変数を5個、10個、100個…」と増やしていくのは現実的ではありません。
そこで登場するのが 配列(array) です。
今日は、
配列とは何か
配列の作り方・使い方
for / for-each と配列の組み合わせ
簡単な「点数管理ミニアプリ」を作る
ここまでを一気に押さえます。
配列とは何かをイメージでつかむ
「同じ型の変数を、番号付きで並べたもの」
まずはイメージからいきましょう。
普通の変数は「1つの箱」です。
int score = 80;
Javaこれは「score という名前の箱に 80 が入っている」状態です。
一方、配列は「同じ型の箱が、番号付きでズラッと並んでいる」イメージです。
int[] scores = new int[5];
Javaこれは、
int 型の箱が 5個並んでいる
それぞれに 0, 1, 2, 3, 4 という番号が振られている
まとめて scores という名前で呼べる
という状態です。
重要なのは、
配列の「中身の型」は1種類だけ
配列の「長さ」は最初に決める
という2点です。
配列の宣言と作成
「型[] 変数名」で宣言し、「new 型[長さ]」で作る
配列を使うには、2ステップあります。
宣言(この変数は配列ですよ、と宣言する)
作成(実際に中身を持った配列を作る)
例えば、int 型の配列を作る場合はこうです。
int[] scores; // 宣言
scores = new int[5]; // 作成
Java1行にまとめて書くこともできます。
int[] scores = new int[5];
Javaここでの意味を整理します。
int[]
→ 「int 型の配列」という意味
→ [] が「配列ですよ」という印
scores
→ 配列の名前(変数名)
new int[5]
→ 「int 型の箱を5個並べた配列を作る」
→ 中身は最初、全部 0 で初期化される
配列の長さは [] の中の数字で決まります。new int[5] なら、要素数は 5 です。
配列の要素にアクセスする
「インデックス(番号)で1つずつ取り出す」
配列の中の1つ1つの要素には、「インデックス」と呼ばれる番号でアクセスします。
例えば、さっきの scores 配列に値を入れてみましょう。
int[] scores = new int[5];
scores[0] = 80;
scores[1] = 75;
scores[2] = 90;
scores[3] = 60;
scores[4] = 100;
Javaここでのポイントは、
最初の要素は scores[0]
最後の要素は scores[4](長さ5の場合)
ということです。
Javaの配列は「0から始まる」ことを、必ず覚えておいてください。
長さが 5 なら、インデックスは 0〜4。
長さが 10 なら、インデックスは 0〜9。
配列の要素を表示するには、こう書きます。
System.out.println(scores[0]); // 80
System.out.println(scores[4]); // 100
Java配列の初期化を一気に書く方法
「中身が決まっているときは、{} でまとめて書ける」
もし、配列の中身が最初から決まっているなら、new int[5] と書かずに、こう書くこともできます。
int[] scores = {80, 75, 90, 60, 100};
Javaこれは、
長さ5の配列を作る
0番目に 80
1番目に 75
2番目に 90
3番目に 60
4番目に 100
という意味になります。
この書き方は、
「固定のデータを配列に入れておきたい」ときにとても便利です。
配列と for文を組み合わせる
「全要素を順番に処理する」のが一気に楽になる
配列の真価は、for 文と組み合わせたときに発揮されます。
例えば、scores 配列の中身を全部表示したいとします。
1つずつ書くとこうなります。
System.out.println(scores[0]);
System.out.println(scores[1]);
System.out.println(scores[2]);
System.out.println(scores[3]);
System.out.println(scores[4]);
Javaでも、for 文を使えば、こう書けます。
for (int i = 0; i < 5; i++) {
System.out.println(scores[i]);
}
Javaさらに、配列の長さを使えば、
「5」という数字を直接書かずに済みます。
for (int i = 0; i < scores.length; i++) {
System.out.println(scores[i]);
}
Javaここでの重要ポイントは scores.length です。
配列変数.length
→ その配列の「長さ」(要素数)を返す
→ scores.length は 5
これを使うことで、
「配列の長さが変わっても、for 文を直さなくていい」
という状態にできます。
配列の合計と平均を求める
「ループで回しながら、変数に足していく」
配列を使った典型的な処理として、
「合計」と「平均」を求める例を見てみましょう。
public class Main {
public static void main(String[] args) {
int[] scores = {80, 75, 90, 60, 100};
int sum = 0;
for (int i = 0; i < scores.length; i++) {
sum = sum + scores[i];
}
double average = (double) sum / scores.length;
System.out.println("合計点: " + sum);
System.out.println("平均点: " + average);
}
}
Javaここでの深掘りポイントは2つあります。
1つ目は、合計の求め方。
sum = sum + scores[i];
→ 1日目・3日目でやった「合計の育て方」と同じ
→ 今回は i を使って、配列の要素を順番に足している
2つ目は、平均の計算。
double average = (double) sum / scores.length;
→ sum は int(整数)
→ scores.length も int
→ int 同士で割り算すると、小数点以下が切り捨てられてしまう
→ (double) sum と書いて、sum を一時的に double 型に変換している
→ これにより、「小数点付きの割り算」になる
この (double) のような書き方を「キャスト」と呼びます。
今日は「整数同士の割り算で小数が欲しいときに使う」と覚えておけば十分です。
拡張for文(for-each)で、もっとシンプルに書く
「配列の全要素を順番に処理するだけなら、インデックスすら要らない」
Javaには、配列を回すためのもう1つの書き方があります。
それが「拡張 for 文(for-each)」です。
さっきの合計計算は、こうも書けます。
int[] scores = {80, 75, 90, 60, 100};
int sum = 0;
for (int score : scores) {
sum = sum + score;
}
Java読み方としては、
「scores 配列の中の要素を、順番に score という変数に取り出していく」
という感じです。
for (型 変数名 : 配列変数)
→ 配列の全要素を、先頭から順番に取り出してループする
→ インデックス(0, 1, 2, …)を意識しなくてよい
インデックスが必要ない場面(ただ全部なめたいだけのとき)は、
for-each のほうが読みやすくなります。
4日目のミニアプリ:5教科の点数管理アプリ
配列+ループで「まとめて扱う」感覚をつかむ
ここまでの内容を組み合わせて、
「5教科の点数を入力して、合計と平均を表示する」ミニアプリを作ってみましょう。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] subjects = {"国語", "数学", "英語", "理科", "社会"};
int[] scores = new int[subjects.length];
System.out.println("=== 5教科点数管理アプリ ===");
for (int i = 0; i < subjects.length; i++) {
System.out.print(subjects[i] + " の点数を入力してください: ");
scores[i] = scanner.nextInt();
}
int sum = 0;
int max = scores[0];
int min = scores[0];
for (int i = 0; i < scores.length; i++) {
sum = sum + scores[i];
if (scores[i] > max) {
max = scores[i];
}
if (scores[i] < min) {
min = scores[i];
}
}
double average = (double) sum / scores.length;
System.out.println("---------------");
System.out.println("合計点: " + sum);
System.out.println("平均点: " + average);
System.out.println("最高点: " + max);
System.out.println("最低点: " + min);
}
}
Javaここでの重要ポイントを深掘りします。
subjects 配列で「教科名」を管理している
→ "国語", "数学", ... を配列にしておくことで、
→ for 文の中で subjects[i] を使って、教科名と点数をセットで扱える
scores 配列で「点数」を管理している
→ subjects.length と同じ長さで作っている
→ 「教科の数が増えたら、scores も自動的に同じ長さになる」
max と min の初期値を scores[0] にしている
→ 最初の1つ目の点数を「仮の最高点・最低点」としておく
→ 2つ目以降と比べながら、より大きい・小さい値で更新していく
この「配列+ループ+条件分岐」の組み合わせは、
現実のアプリでも頻出パターンです。
配列でよくやってしまうミスと、その防ぎ方
「インデックスの範囲」と「length」の意識
配列を使い始めると、ほぼ確実に一度は出会うエラーがあります。
ArrayIndexOutOfBoundsException
これは、「配列の範囲外のインデックスにアクセスした」ときに出るエラーです。
例えば、長さ5の配列でこう書くとアウトです。
int[] scores = new int[5];
scores[5] = 100; // ダメ(有効なのは 0〜4)
Javafor 文でも、条件を間違えると同じことが起きます。
for (int i = 0; i <= scores.length; i++) { // ダメ(<= にしてしまっている)
System.out.println(scores[i]); // 最後に scores[length] にアクセスしてしまう
}
Java正しくは < です。
for (int i = 0; i < scores.length; i++) {
System.out.println(scores[i]);
}
Java防ぎ方としては、
配列を回すときは「0 から length 未満」
→ i = 0; i < 配列.length; i++ を“型”として覚える
というのが一番強いです。
4日目で一番大事な感覚
「配列は“同じ種類の情報をまとめる棚”」
今日あなたに持ってほしい感覚はこれです。
配列は、単なる「複数の変数の代わり」ではありません。
アプリの中に「同じ種類の情報をまとめて置いておく棚」を作る道具です。
点数の棚
商品価格の棚
ユーザー名の棚
こういう棚を作っておくと、
for 文や for-each で「棚の中身を順番に処理する」ことができるようになります。
配列+ループを使えるようになると、
アプリが一気に「複数のデータを扱える世界」に広がります。
4日目のまとめと、5日目への予告
今日やったことを短く整理すると、
配列は「同じ型の値を、番号付きで並べたもの」型[] 変数名 = new 型[長さ]; で配列を作る配列[インデックス] で要素にアクセスする(0から始まる)配列.length で長さを取得し、for 文と組み合わせる
拡張 for 文(for-each)で、全要素をシンプルに処理できる
配列+ループで、合計・平均・最大・最小などを求められる
5日目は、ここから一歩進んで、
「配列より柔軟に増減できるコレクション(ArrayList)」に触れていきます。
さらに、文字列の扱いも少し深掘りして、
「アプリでよくある“リスト管理”」に近づけていきます。
