Table of Contents
配列とは、プログラム内で同じ型の値をまとめて保持することができる仕組みです。
例えば、出席番号順にテストの点数を管理するプログラムを考えます。
配列を使わない場合、次のように一つずつ変数を作って管理することになります。
//出席番号順に40人分の点数を代入 int student00 = 73; int student01 = 98; int student02 = 79; . . . int student39 = 65;
しかし、この方法では変数の数が膨大になるので扱うのが大変です。
配列の使い方
このように、同じ型の大量の変数を扱う場合は、配列を利用すると管理が楽になります。
配列の宣言方法は以下の通りです。通常の変数とは少し異なるので注意してください。
/* 宣言方法 型名 配列名[] = new 型名[配列数]; または 型名 []配列名 = new 型名[配列数]; または 型名[] 配列名 = new 型名[配列数]; */ int test[] = new int[40]; int []test = new int[40]; int[] test = new int[40];
配列には様々な宣言方法がありますが、どれか一つで統一するのが良いと思います。このサイトでは一番上の宣言方法を使っていきます。
この宣言によって、int型の変数(配列の要素)が40個できた状態となります。
配列の要素に値を代入するときは、何番目の要素に値を入れるかを指定する必要があります。方法は、変数名の後の括弧 [] の中に数字を入れます。この括弧の中に指定する数字をインデックスと呼びます。
// 宣言および初期化 int test[] = new int[40]; // 配列の要素に値を代入 test[0] = 73; test[1] = 98; test[2] = 79; // ... // 略 // ... test[38] = 72; test[39] = 65; //test[40] = 65; これは41個目の要素になるのでエラー
ここで注意が必要なのは、配列の要素は0番目から始まることです。
これによって最後の要素の番号は(配列の個数 – 1)番となります。
上の例では、40個の配列を用意したので、要素番号は 0 〜 39 となり、最後の要素の番号が39番となります。混乱しやすいので注意してください。
配列の宣言と同時に初期値を設定する
配列の宣言と同時に、配列の要素に値を代入することもできます。
/* 宣言方法 型名 変数名[] = {値1, 値2, 値3, ... ,値n}; */ int test[] = {11, 20, 33, 42, 76};
この書き方では、配列数を指定しません。
括弧 {} の中に書いた値の個数が自動的に配列の要素数となります。
この書き方は、次の書き方と全く同じ意味になります。
int test[] = new int[5]; test[0] = 11; test[1] = 20; test[2] = 33; test[3] = 42; test[4] = 76;
配列から値を取り出す
それでは、実際に配列に値を格納して、それを取り出してみましょう。インデックスを指定すると通常の変数と同じように扱えます。
import java.util.Scanner; public class Test { public static void main(String args[]) { // 配列の要素数 int scoreCount = 5; // 要素が scoreCount 個(5個)の配列を宣言して初期化 int score[] = new int[scoreCount]; // 要素に値を代入 score[0] = 56; score[1] = 63; score[2] = 87; score[3] = 73; score[4] = 99; // ループを使って配列に格納した全ての要素を表示 for (int i = 0; i < scoreCount; i = i + 1) { System.out.println((i+1) + "人目の点数は" + score[i] + "です"); } } }
このプログラムの実行結果は以下のようになります。
配列の要素を表示する部分では、次のような書き方をしています
System.out.println((i+1) + "人目の点数は" + score[i] + "です");
配列の要素は 0 番目から始まるので、(i + 1) として「1人目」から始まるようにしています。
このように配列を使うと、配列の要素全てをループによって順番に表示させたりすることができます。
変数をひとつ一つ作った場合に行うのが難しい処理も、配列を使う事で解決できる事があります。
次のプログラムは、配列の要素を自分で設定するものです。
import java.util.Scanner; public class Test { public static void main(String args[]) { // 配列に格納したい点数の数 int scoreCount = 5; // 要素が score_count 個(5個)の配列を宣言して初期化 int score[] = new int[scoreCount]; Scanner scan = new Scanner(System.in); System.out.println(scoreCount + "人分のテストの点数を入力します"); // ループを使って全ての要素に値を代入する for (int i = 0; i < scoreCount; i = i + 1) { System.out.println((i+1) + "人目の点数を入力してください: "); score[i] = scan.nextInt(); } scan.close(); System.out.println(scoreCount + "人分のテストの点数を表示します"); // ループを使って配列に格納した全ての要素を表示 for (int i = 0; i < scoreCount; i = i + 1) { System.out.println((i+1) + "人目の点数は" + score[i] + "です"); } } }
プログラムが複雑になってきましたが、いままで紹介した書き方の組み合わせですので、分からなくなったら前のページを読み直してみてください。
実行結果は以下のようになります。
配列の応用例
例えば、1 〜 12 までの数字を入力したら、それに対応する月の英語名を表示してくれるプログラムを作る場合を考えてみましょう。
方法としては、入力された数値に応じて if文 や switch文 などを使って処理を分岐する方法がまず浮かびます。
例えば、以下のようなプログラムです。
import java.util.Scanner; public class Test { public static void main(String args[]) { Scanner scan = new Scanner(System.in); System.out.println("何月?"); int month = scan.nextInt(); scan.close(); // 入力値で分岐 switch(month) { case 1: System.out.println("January"); break; case 2: System.out.println("February"); break; case 3: System.out.println("March"); break; case 4: System.out.println("April"); break; case 5: System.out.println("May"); break; case 6: System.out.println("June"); break; case 7: System.out.println("July"); break; case 8: System.out.println("August"); break; case 9: System.out.println("September"); break; case 10: System.out.println("October"); break; case 11: System.out.println("November"); break; case 12: System.out.println("December"); break; default: System.out.println("その月は存在しません。"); } } }
これでも、入力した数値に応じて月の英語名を表示する事ができます。
しかし、条件分岐の数が多く、プログラムが長くなってしまっています。
このような場合、配列を使う事でプログラムを簡潔に書くことができます。
import java.util.Scanner; public class Test { public static void main(String args[]) { // 全ての月名をString型の配列に格納 String monthName[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; Scanner scan = new Scanner(System.in); System.out.println("何月?"); int month = scan.nextInt(); scan.close(); if (month >= 1 && month <= 12) { // 入力値が 1 以上 12 以下の場合 System.out.println(monthName[month - 1]); } else { System.out.println("その月は存在しません。"); } } }
String型の配列の要素として、月名を全て格納しています。
月名を表示する部分では、入力値から 1 を引き、インデックスとしています。
配列の要素は 0 番目から始まるからです。
実行結果は以下のようになります。