前回は、複数のデータを表形式で管理できる「多次元配列」について学習しました。
通常の配列は、複数のデータをまとめて管理するために便利な仕組みです。ただし、配列は基本的に作成時に要素数を決めます。
int[] scores = new int[3];
この配列は、3つの整数を格納できます。
では、最初は3件だったデータが、あとから5件、10件と増えていく場合はどうすればよいでしょうか?
このような場面で便利なのが、今回学ぶArrayList(アレイリスト)です。
ArrayListは、複数のデータをまとめて管理できるクラスです。
配列と似ていますが、要素の追加や削除に応じて、リストのサイズを柔軟に変えられるという特徴があります。
例えば、受講者の名前を管理する場合を考えてみましょう。
田中
鈴木
佐藤
あとから新しい受講者が増えた場合も、ArrayListならデータを追加できます。
ArrayListを使うには、最初に次のimport文を記述します。
import java.util.ArrayList;
これは、Javaの標準ライブラリに用意されているArrayListクラスを利用するための記述です。
まずは、文字列を管理するArrayListを作成してみます。
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
}
}
ここで注目したいのが、次の部分です。
ArrayList<String> names = new ArrayList<>();
この例では、文字列を格納するArrayListを作成しています。
なお、ArrayListには、基本型のintやdoubleをそのまま型引数として指定することはできません。整数を扱う場合は、対応するクラス型のIntegerを使用します。
ArrayList<Integer> numbers = new ArrayList<>();
ArrayListにデータを追加するには、add()メソッドを使用します。
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
names.add("田中");
names.add("鈴木");
names.add("佐藤");
System.out.println(names);
}
}
[田中, 鈴木, 佐藤]
add()を呼び出すたびに、リストへデータが追加されます。
配列のように、最初に格納する件数を決めておく必要はありません。
リストに格納したデータを取り出すには、get()メソッドを使用します。
System.out.println(names.get(0));
System.out.println(names.get(1));
System.out.println(names.get(2));
田中
鈴木
佐藤
get()に指定する番号は、配列と同じく0から始まります。
存在しない位置を指定すると、実行時にIndexOutOfBoundsExceptionが発生するため注意しましょう。
登録済みのデータを変更する場合は、set()メソッドを使用します。
names.set(1, "高橋");
System.out.println(names);
[田中, 高橋, 佐藤]
set()では、変更したい位置と新しい値を指定します。
names.set(位置, 新しい値);
この例では、2番目のデータである「鈴木」が「高橋」に変更されました。
データを削除する場合は、remove()メソッドを使用します。
names.remove(1);
System.out.println(names);
[田中, 佐藤]
remove(1)によって、2番目のデータが削除されました。
削除されたあとは、残ったデータが詰められるため、リストの位置が変わることがあります。
また、ArrayList<String>の場合は、位置ではなく値を指定して削除することもできます。
names.remove("田中");
このように、位置や値を指定してデータを削除できます。
ArrayListに何件のデータが格納されているかを調べるには、size()メソッドを使用します。
System.out.println(names.size());
例えば、リストに「田中」「鈴木」「佐藤」の3件が格納されている場合、実行結果は次のようになります。
3
ここで、配列との違いを確認しておきましょう。
配列のlengthはフィールドですが、ArrayListのsize()はメソッドです。書き方を混同しないようにしましょう。
ArrayListに登録されたデータを順番に処理する場合は、for文を使用できます。
ArrayList<String> names = new ArrayList<>();
names.add("田中");
names.add("鈴木");
names.add("佐藤");
for (int i = 0; i < names.size(); i++) {
System.out.println(names.get(i));
}
田中
鈴木
佐藤
for文で位置を管理し、get(i)で各データを取得しています。
繰り返し条件には、配列のlengthではなく、ArrayListのsize()を使用する点がポイントです。
すべてのデータを順番に取り出したい場合は、拡張for文も利用できます。
for (String name : names) {
System.out.println(name);
}
拡張for文では、添字を使わずにデータを1つずつ取り出せます。
単純にすべてのデータを処理したい場合は、拡張for文を使うとコードが簡潔になります。
int[] scores = new int[3];
ArrayList<Integer> scores = new ArrayList<>();
件数が変わらないデータには配列、追加・削除が必要なデータにはArrayListというように、目的に応じて使い分けましょう。
ArrayListを利用する場合は、通常、ファイルの先頭に次の記述が必要です。
import java.util.ArrayList;
ArrayListの要素数を取得するときは、lengthではなくsize()を使います。
names.size()
ArrayListの位置も0から始まります。最初のデータはget(0)で取得します。
ArrayListの型引数には、intではなくIntegerを指定します。
ArrayList<Integer> numbers = new ArrayList<>();
ArrayListは、受講者一覧や商品一覧など、登録件数が変わるデータを扱うときに便利です。
次回は、データに名前や番号などのキーを付けて管理できるHashMapについて学習します。