初心者入門レベルの【Javaの勉強】配列とコレクション
2020/04/02
今回は、「変数」をまとめて扱うことのできるデータ形式として、配列とコレクションについて勉強します。
配列の使い方
「配列」によって複数の「変数」をまとめて扱うことができますが、まとめた「変数」を「要素」と呼び、「要素」は添字(インデックス)いう番号によって識別されます。
「配列」の宣言は、例えば以下のように記述します。
int[] a;
a = new int[3];
これは“int”の型の「要素」を3つ持つ“a”という「配列」を宣言していますが、まとめて以下のように記述することもできます。
int[] a = new int[3];
“new”を使っていることからも分かるように「配列」は「インスタンス」として作られ、ここでの“a”には「配列」の参照値が保存されます。
また、「配列」の「要素」の数は「インスタンス化」したときに確定し、後で変更することはできません。
「配列」の利用方法の例として、以下のプログラムを作ってみましょう。
public class TestArray01 {
public static void main(String[] args) {
int[] array = new int[3];
array[0] = 10;
array[1] = 20;
array[2] = 30;
for (int i = 0; i < 3; i++) {
System.out.println(array[i]);
}
}
}
このように「変数」をまとめることによって、添字をカウンタにしたループ処理で「変数」を利用できるのも「配列」の便利な点の一つです。
ここで、「配列」の添字が“0”から始まっていることに注意してください。
うっかりして添字の範囲を超えてデータにアクセスするようなプログラムを作ると、コンパイル時にはエラーになりませんが、実行時にエラーになるので気をつけましょう。
また、各「要素」の宣言と初期化する際に、このプログラムのように宣言してから一つずつ代入する以外にも、次のように一度にまとめて記述することもできます。
int[] array = new int[]{10, 20, 30};
さらに次のように“new”を省略しても、見た目上はまるで「クラス」ではないようになりますが、記述としては問題ありません。
int[] array = {10, 20, 30};
「配列」の「要素」には、基本データ型の他に「インスタンス」を扱うこともできますが、例えば文字列を扱う「クラス」の“String”を「要素」にする場合は以下のように宣言します。
String[] strArray = new String[3];
「配列」の「インスタンス変数」“length”
「配列」の「インスタンス変数」として、その「要素」の数を値として持つ“length”があります。
その使用例として、以下のプログラムを作ってみましょう。
public class TestArray02 {
public static void main(String[] args) {
System.out.println("配列の要素数:" + args.length);
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
}
}
}
これまで度々利用してきた「メソッド」の“main”ですが、よく見ると引数に“String”の型の配列を持っています。
この引数にはプログラムの実行時に渡される値が格納されていて、上記のプログラムに値を渡して実行すると、次のような結果が得られます。
>java TestArray02 A BB CCC
配列の要素数:3
A
BB
CCC
>
多次元配列
「配列」は複数の添字を使って多次元配列として利用することができますが、これは上記の一次元配列の中にさらに「配列」を作るようなイメージになります。
その宣言方法は、例えば以下のようになります。
int[][] a;
a = new int[2][];
a[0] = new int[3];
a[1] = new int[3];
この二次元配列の宣言は、さらに以下のように1行にまとめて記述することもできます。
int[][] a = new int[2][3];
多次元配列の例として、以下の掛け算九々の表示をするプログラムを作ってみましょう。
public class TestArray03 {
public static void main(String[] args) {
int[][] array = new int[9][9];
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
array[i][j] = (i + 1) * (j + 1);
}
}
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j] + "\t");
}
System.out.println("");
}
}
}
ちなみに、多次元配列では以下のように「要素」の数が異なる配列を組み合わせることもできます。
int[][] a;
a = new int[3][];
a[0] = new int[2];
a[1] = new int[3];
a[2] = new int[1];
コレクションの使い方
以上のように便利な配列ですが、一度決めた「要素」の数を変えることができないというのは何かと不便です。
そこでさらに便利に利用できるのが、「要素」の数を変えることのできる機能を持つ「コレクション」という「クラス」です。
「コレクション」は大きく分けて、インデックスを持って「要素」の順番を保持する“List”、重複「要素」を禁止する“Set”、キーと値が対になった「要素」を持つ“Map”の3つの分類があります。
まずここでは、「コレクション」の中でも最も応用範囲の広い“ArrayList”の「クラス」について勉強しましょう。
“ArrayList”は「インスタンス」の参照値を保持する「クラス」で、「基本データ型」の値は格納できませんが、保持した「要素」の集まりを「リスト」と呼び、各「要素」はインデックスで管理されます。
“ArrayList”を利用する場合は、「インスタンス」を生成して、保持したい参照値を「メソッド」によって渡したり取り出したりしますが、使用する主な「メソッド」には以下のようなものがあります。
メソッド | 機能 |
---|---|
boolean add(Objecto) | リストの最後に、oで指定したインスタンスの参照値を追加 |
void add(int index, Object o) | リスト内のindexで指定した位置に、oで指定したインスタンスの参照値を追加 |
object get(int index) | リスト内のindexで指定した位置にあるインスタンスの参照値を返す |
object remove(int index) | リスト内のindexで指定した位置にあるインスタンスの参照値を削除 |
int size() | リスト内にある要素の数を返す |
ここで“ArrayList”を使った例として、以下のプログラムを作ってみましょう。
import java.util.ArrayList;
class Staff {
String name;
String department;
Staff(String name, String department) {
this.name = name;
this.department = department;
}
}
public class TestList01 {
public static void main(String[] args) {
ArrayList<Staff> company = new ArrayList<Staff>();
Staff staff = new Staff("山田 太郎", "営業部");
company.add(staff);
staff = new Staff("高橋 花子", "総務部");
company.add(staff);
for (int i = 0; i < company.size(); i++) {
staff = company.get(i);
System.out.println("社員名:" + staff.name + "\t所属部署:" + staff.department);
}
}
}
それでは、このプログラムの内容をおおまかに見てみましょう。
先頭の「import文」がありますが、これによって後に“ArrayList”を記述する際に、“java.util.ArrayList”と書くところを“ArrayList”と省略できるようになります。
このプログラムで、“Staff”の「クラス」は会社の社員を表していて、名前の“name”と所属部署の“department”を「フィールド」として持っています。
また名前と所属部署を引数として取る「コンストラクタ」を持っていて、「インスタンス」を生成すると各引数の値を「フィールド」に代入する仕組みになっています。
“main”の「メソッド」の中で、まず“ArrayList”の「インスタンス」を生成して、その参照値を“company”に代入しています。
ここで“<Staff>”と記述しているのは「J2SE 5.0」で採用された「ジェネリクス」という機能で、「コレクション」でこれを利用した場合指定した型の「インスタンス」しか入れられないようになります。
その次に“Staff”の「クラス」の「インスタンス」を生成し、“ArrayList”の「メソッド」の“add”を使って、その参照値を“ArrayList”の「インスタンス」の“company”に追加しています。
最後の“for”を使ったループの中で、“ArrayList”の「メソッド」の“get”を使って格納した参照値を取り出し、その値を使って「フィールド」の各値を表示しています。
このプログラムを実行してみると、結果は次のようになります。
>java TestList01
社員名:山田 太郎 所属部署:営業部
社員名:高橋 花子 所属部署:総務部
>
まとめ
今回は「配列」と、そして「配列」よりもさらに便利に利用できる「コレクション」についておおまかに勉強してみました。
これらは、複数の「変数」や「インスタンス」をまとめて扱ったり、順番に処理したりする際にとても重要になる仕組みなので、是非ここで十分にマスターしておきましょう。
それでは、今回はここまでです。
《 【Javaの勉強】一覧 》