|
||||
|
|
配列、コマンドライン引数、多重配列
|
|
|
配列とは、、
複数の値をまとめて扱う場合に1〜2つ程度であれば前章で説明したように変数を使用すれば問題ないとおもいます。 しかし扱うデータが100個になった場合はどうでしょう!? [ 変数を100個宣言して、、] なんてしていてはとても大変です。 こんな時には通常は [ 配列 ] と呼ばれるものを使用します。
配列とは複数の変数の集合を表わします。 ただし、一つの配列を表す変数に含めることが出来るデータ型は各要素で共通でなくてはなりません。つまり、特定の要素を int型にして、別の要素を long型と言う配列は作成できません。 このように配列は複数の変数の集合になりますので、各要素へのアクセスは [要素番号] を指定します。 Javaで使用できる変数には大きく分けて、基本データ型(プリミティブ型)と、参照型の 2つの型があると言うことは前述しました。int などは 基本データ型と異なり 配列は参照型になります。 配列型変数にここの要素が格納されているように見えるかもしれませんが、ここの要素は別の領域に確保されており配列方変数にはその領域への参照が格納されています。 配列の定義配列の作成Javaで配列を宣言する場合は、宣言時に配列であることを []をつけて明示します。 int[] i; // 整数型の配列を宣言 int i[]; // このように記述することも可能配列は参照型変数になるので new キーワードを使用して実体を作成します。 int[] i; // 整数型の配列を宣言 i = new int[5]; // 0〜4の要素を持つ配列を作成 i[0] = 1; // 各要素に値を代入 i[1] = 2; i[2] = 3; i[3] = 4; i[4] = 5;[ 上記を図解すると・・・ ]
お気付きだと思いますが、配列の要素は 0から始まります。 宣言時に 5とした場合は 0〜4 で 5個の要素をもつ配列を作成すると言う意味になります。 また、配列のサイズは初期化時に決定して、後で変更することができません。範囲外の要素にアクセスしてもエラーとならない言語もありますが、Javaでは例外がスローされますので注意してください。 ただし配列のコピーを行った場合は配列の宣言後に要素数が変更されます。(後述) その他の作成方法以下のように記述をしても同じ配列を作成することが出来ます。 宣言と生成を同時に実行int[] i = new int[5]; // 宣言と初期化を同時に行う i[0] = 1; i[1] = 2; i[2] = 3; i[3] = 4; i[4] = 5; 宣言と値の代入を同時に実行
int[] i = {1, 2, 3, 4, 5}; // 宣言と代入を同時に行う
配列の操作値の参照・代入配列の各要素へのアクセスは、上記でも紹介しているように [] の中にアクセスしたい要素番号を指定する以外は通常の変数と変わりありません。 値の参照
public class ArraySample {
public static void main(String args[]){
int[] i = {1, 2, 3, 4, 5};
//要素の参照
System.out.println("i[4] = " + i[4]);
System.out.println("i[3] = " + i[3]);
}
}
[出力]
i[4] = 5 i[3] = 4このように配列の4番目(先頭は0から始まります)の要素は「5」と、3番目の要素は「4」と正しく出力されましたね。 では今度は初期化した配列の値を変更して、再度出力してみます。 値の参照・代入
public class ArraySample {
public static void main(String args[]){
int[] i = {1, 2, 3, 4, 5};
//要素の参照
System.out.println("i[4] = " + i[4]);
System.out.println("i[3] = " + i[3]);
//値の代入
i[4] = 9;
i[3] = 10;
//要素の参照
System.out.println("i[4] = " + i[4]);
System.out.println("i[3] = " + i[3]);
}
}
[出力]
i[4] = 5 i[3] = 4 i[4] = 9 i[3] = 10このように通常の変数と同じように代入して値が変わるのが確認できます。 要素数の取得通常配列を使用する中で、必ずしも要素の数が決まっているという事は稀で、たいていはいくつ要素があるか分からない配列に対してプログラムを記述することが一般的です。ただしJavaでは、確保している要素外にアクセスしようとした場合、後述するような例外が発生します。 そのような場合配列の要素がいくつ在るのかを確認してから要素へアクセスをすれば例外が発生させずに済みます。プログラムを組む上で重要な事は「入力データを信用しない事」です。 配列の要素数を取得
public class ArraySample {
public static void main(String args[]){
int iCnt;
int[] i = new int[10];
System.out.println("配列の要素数は" + i.length + "です。");
for(iCnt = 0 ; iCnt < i.length; iCnt++){
i[iCnt]= iCnt;
}
for(iCnt = 0 ; iCnt < i.length; iCnt++){
System.out.print(i[iCnt]);
System.out.print(" ");
}
}
}
[出力]
配列の要素数は10です。 0 1 2 3 4 5 6 7 8 9このように配列の要素数を取得するには 「配列変数.length」 と記述するだけです。 ただし気を付けたいのは、アクセスできる最大の要素番号が返却されるわけではなく、あくまで要素数という事です。しつこいようですが、配列の要素番号は 0から始まるのでアクセス出来る最大の要素番号は「返却された値 −1」となります。 コマンドライン引数
コマンドライン引数とは、あるコマンドの後ろにパラメータを渡してあげる引数を指します。 1章で紹介している お決まりの Hello World アプリケーション では、コンパイルする際「javac」の後にコンパイルしたいファイル名を指定しています。javacからみるとこれがコマンドラインから渡される引数となります。
javacではパラメータで受け取ったファイルに対してコンパイルを実行すると言う動作を行います。また、コマンドプロンプトから 「java -version」と入力してみてください。表示されるバージョンは異なりますが、下図のような表示がされます。 ![]() このように javaコマンドは -versionというコマンドライン引数が与えられ時にそのバージョンを表示するように定義されているのです。javaアプリケーションでも、このよう実行時に クラスファイルの後ろにパラメータを指定することで、プログラムの内部から与えられたパラメータを参照することが出来ます。 javaプログラムでは、コマンドラインで渡された引数は、main()メソッドの引数であるStringクラスの配列に格納され渡されます。今までおまじないのように記述していたコードがどのような役割を持っているのかみてみましょう。 コマンドライン引数を表示する
public class CommandLineSample {
public static void main(String args[]){
System.out.println("コマンドライン引数1番目「" + args[0] + "」");
System.out.println("コマンドライン引数2番目「" + args[1] + "」");
System.out.println("コマンドライン引数3番目「" + args[2] + "」");
}
}
[実行]
C:\>java CommandLineSample one two three コマンドライン引数1番目「one」 コマンドライン引数2番目「two」 コマンドライン引数3番目「three」このようにパラメータで渡した「one」と「two」と「three」に args[] を使用して参照することができました。 ArrayIndexOutOfBoundsException今度はプログラムは変更せずにパラメータの数を2つに減らしてみます。結果は存在しない要素にアクセスしようとしたため、以下のように実行時エラーとなり 例外がスローされます。 パラメータを減らして実行
C:\>java CommandLineSample one two
コマンドライン引数1番目「one」
コマンドライン引数2番目「two」
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at CommandLineSample.main(CommandLineSample.java:6)
例外について後述しますが、軽く見方だけ説明すると、上記では ArrayIndexOutOfBoundsExceptionと言う種類の例外が、CommandLineSample.java の 6行目で発生したことを表しています。この ArrayIndexOutOfBoundsException が、存在しない要素にアクセスしようとした時に発生する例外になります。引数の数を指定してみる引数が足りなかっただけでエラーとなってしまうプログラムではしょうがないので、引数の数を指定するプログラムを作って見ましょう。仕組みは簡単で引数の要素数を確認して3以外であればエラーメッセージと共にプログラムを終了します。
public class CommandLineSample {
public static void main(String args[]){
if(args.length != 3){
System.out.println("このプログラムには引数を3つ指定します。");
return;
}
System.out.println("コマンドライン引数1番目「" + args[0] + "」");
System.out.println("コマンドライン引数2番目「" + args[1] + "」");
System.out.println("コマンドライン引数3番目「" + args[2] + "」");
}
}
引数を三つ指定して実行C:\>java CommandLineSample one two three コマンドライン引数1番目「one」 コマンドライン引数2番目「two」 コマンドライン引数3番目「three」 引数を二つ指定して実行C:\>java CommandLineSample one two このプログラムには引数を3つ指定します。このように予期せぬエラーではなくプログラムを終了させることが出来ました。コマンドライン引数を使用する場合は、どのようなパラメータが渡されるか予測がつきませんので、それを考慮したプログラムであることが必要です。 |
|||||||||||||||||||||