プログラムの練習中に模写したサンプルの中に下記のような記述があったのですが、練習の主題ではなかったため、角括弧([])の意味を理解しないまま、黙々と入力してました。
int[] Values = new int[3];
この変数や型の後ろに付いている角括弧([])が配列を意味しているということを知ったので、配列についてメモしておきます。
例として、下記の写真ファイルについて、ファイル名、撮影緯度、撮影経度、撮影日を表示するプログラムを考えてみます。
写真No. | ファイル名 | 撮影緯度 | 撮影経度 | 撮影日 |
---|---|---|---|---|
写真1 | pic01.jpg | 35.684373 | 139.735227 | 2014-11-05 |
写真2 | pic02.jpg | 35.623950 | 139.768985 | 2015-02-21 |
写真3 | pic03.jpg | 35.352608 | 140.153968 | 2015-09-30 |
写真4 | pic04.jpg | 33.537731 | 129.893797 | 2016-01-15 |
まずはベタに記述してみる
それぞれの値に個別の変数を設定して、これを画面に表示する場合、こんなプログラムになります。
class ArrayTest1 {
public static void main(String[] args) {
String filename1 = "pic01.jpg";
String filename2 = "pic02.jpg";
String filename3 = "pic03.jpg";
String filename4 = "pic04.jpg";
double latitude1 = 35.684373;
double latitude2 = 35.623950;
double latitude3 = 35.352608;
double latitude4 = 33.537731;
double longitude1 = 139.735227;
double longitude2 = 139.768985;
double longitude3 = 140.153968;
double longitude4 = 129.893797;
String day1 = "2014-11-05";
String day2 = "2015-02-21";
String day3 = "2015-09-30";
String day4 = "2016-01-15";
System.out.println(filename1 + " 撮影場所(" + latitude1 + "," + longitude1 + ")撮影日:" + day1);
System.out.println(filename2 + " 撮影場所(" + latitude2 + "," + longitude2 + ")撮影日:" + day2);
System.out.println(filename3 + " 撮影場所(" + latitude3 + "," + longitude3 + ")撮影日:" + day3);
System.out.println(filename4 + " 撮影場所(" + latitude4 + "," + longitude4 + ")撮影日:" + day4);
}
}
とりあえず配列を使ってみる
上記プログラム(ArrayTest1)に配列を適用すると、同じグループの変数の型を最初にまとめることができます。
class ArrayTest2 {
public static void main(String[] args) {
String[] filename;
double[] latitude;
double[] longitude;
String[] day;
filename = new String[4];
filename[0] = "pic01.jpg";
filename[1] = "pic02.jpg";
filename[2] = "pic03.jpg";
filename[3] = "pic04.jpg";
latitude = new double[4];
latitude[0] = 35.684373;
latitude[1] = 35.623950;
latitude[2] = 35.352608;
latitude[3] = 33.537731;
longitude = new double[4];
longitude[0] = 139.735227;
longitude[1] = 139.768985;
longitude[2] = 140.153968;
longitude[3] = 129.893797;
day = new String[4];
day[0] = "2014-11-05";
day[1] = "2015-02-21";
day[2] = "2015-09-30";
day[3] = "2016-01-15";
System.out.println(filename[0] + " 撮影場所(" + latitude[0] + "," + longitude[0] + ")撮影日:" + day[0]);
System.out.println(filename[1] + " 撮影場所(" + latitude[1] + "," + longitude[1] + ")撮影日:" + day[1]);
System.out.println(filename[2] + " 撮影場所(" + latitude[2] + "," + longitude[2] + ")撮影日:" + day[2]);
System.out.println(filename[3] + " 撮影場所(" + latitude[3] + "," + longitude[3] + ")撮影日:" + day[3]);
}
}
写真の撮影緯度に関する変数(latitude)部分を抜き出してみると、こんな感じになります。
double[] latitude;
latitude = new double[4];
latitude[0] = 35.684373;
latitude[1] = 35.623950;
latitude[2] = 35.352608;
latitude[3] = 33.537731;
1行目で変数「latitude」の型を「double[]」と宣言しています。「double[]」は「doubleの配列」という宣言であり、この時点ではメモリ領域をどれだけ確保するのか決まっていません。「double[]」は、頭に「double」がくっ付いていますが、メモリ領域を確保する範囲が決まっている基本型ではなく、参照型なのです。
そして、3行目の「latitude = new double[4];」で変数「latitude」に 4つ分のメモリ領域を確保して、4行目以降、0から始まる通し番号を角括弧で囲んだ形式で値を代入します。
少しまとめて記述してみる
ArrayTest2プログラムは、下記のように宣言部分とメモリ確保部分を一緒に記述することができます。これは、これまでにも散々やってきた「まとめ方」なので、抵抗なく受け入れることができます。
class ArrayTest3 {
public static void main(String[] args) {
String[] filename = new String[4];
double[] latitude = new double[4];
double[] longitude = new double[4];
String[] day = new String[4];
filename[0] = "pic01.jpg";
filename[1] = "pic02.jpg";
filename[2] = "pic03.jpg";
filename[3] = "pic04.jpg";
latitude[0] = 35.684373;
latitude[1] = 35.623950;
latitude[2] = 35.352608;
latitude[3] = 33.537731;
longitude[0] = 139.735227;
longitude[1] = 139.768985;
longitude[2] = 140.153968;
longitude[3] = 129.893797;
day[0] = "2014-11-05";
day[1] = "2015-02-21";
day[2] = "2015-09-30";
day[3] = "2016-01-15";
System.out.println(filename[0] + " 撮影場所(" + latitude[0] + "," + longitude[0] + ")撮影日:" + day[0]);
System.out.println(filename[1] + " 撮影場所(" + latitude[1] + "," + longitude[1] + ")撮影日:" + day[1]);
System.out.println(filename[2] + " 撮影場所(" + latitude[2] + "," + longitude[2] + ")撮影日:" + day[2]);
System.out.println(filename[3] + " 撮影場所(" + latitude[3] + "," + longitude[3] + ")撮影日:" + day[3]);
}
}
さらに簡単に記述できる
上記プログラムは、さらに下記のように記述することができます。
class ArrayTest4 {
public static void main(String[] args) {
String[] filename = new String[]{"pic01.jpg", "pic02.jpg", "pic03.jpg", "pic04.jpg"};
double[] latitude = new double[]{35.684373, 35.623950, 35.352608, 33.537731};
double[] longitude = new double[]{139.735227, 139.768985, 140.153968, 129.893797};
String[] day = new String[]{"2014-11-05", "2015-02-21", "2015-09-30", "2016-01-15"};
System.out.println(filename[0] + " 撮影場所(" + latitude[0] + "," + longitude[0] + ")撮影日:" + day[0]);
System.out.println(filename[1] + " 撮影場所(" + latitude[1] + "," + longitude[1] + ")撮影日:" + day[1]);
System.out.println(filename[2] + " 撮影場所(" + latitude[2] + "," + longitude[2] + ")撮影日:" + day[2]);
System.out.println(filename[3] + " 撮影場所(" + latitude[3] + "," + longitude[3] + ")撮影日:" + day[3]);
}
}
この記法のポイントは、波括弧({})の中に各値をカンマ区切りで並べることと、代入する個数を数値で記載せずに、波括弧({})の中の値の個数で管理することです。
角括弧の位置
再び、写真の撮影緯度に関する変数(latitude)部分を抜き出して、角括弧([])の記載位置について検証します。
double[] latitude;
latitude = new double[4];
latitude[0] = 35.684373;
latitude[1] = 35.623950;
latitude[2] = 35.352608;
latitude[3] = 33.537731;
new(作成)する行については、参照型(doubleの配列)に4つのメモリ領域を確保という意味なので、この位置に角括弧([])を記述します。
そして、変数に値を代入する4行目以降では、各変数のために確保したメモリ領域の参照先を0からの通し番号で記載するので、変数の後ろに角括弧([])をくっ付けます。
では、最初の行(double[] latitude;)はどうなのかというと、なぜか変数の後ろに角括弧([])を付けてもOKです。なので、宣言部分に関しては、下記のよう角括弧([])の位置をバラバラに記述しても問題なく実行されます。これは、C/C++ 言語の名残なんだそうです。
class ArrayTest5 {
public static void main(String[] args) {
String[] filename;
double[] latitude;
double longitude[];
String day[];
<中略>
}
}
プログラムの実行
ArrayTest1~5のプログラムを実行すると、すべて同じ結果になります。
pic01.jpg 撮影場所(35.684373,139.735227)撮影日:2014-11-05
pic02.jpg 撮影場所(35.62395,139.768985)撮影日:2015-02-21
pic03.jpg 撮影場所(35.352608,140.153968)撮影日:2015-09-30
pic04.jpg 撮影場所(33.537731,129.893797)撮影日:2016-01-15
-- Press any key to exit (Input "c" to continue) --
使用している参考書はこちら。
コメント
コメントなどありましたら、GitHubのディスカッションへお願いします。(書き込みには、GitHubのアカウントが必要です)