今回やること
ArrayListは、後から要素を増減できるリストです。買い物リストを一つ作り、基本操作を順に加えます。
前提: Java入門 #14 - Scannerまでの変数、メソッド、繰り返しを理解していること。
| 操作 | 書き方 | 意味 |
|---|---|---|
| 追加 | add(value) | 末尾へ追加する |
| 取得 | get(index) | 指定位置の要素を読む |
| 置換 | set(index, value) | 指定位置の要素を入れ替える |
| 削除 | remove(index) | 指定位置の要素を消す |
| 件数 | size() | 現在の要素数を返す |
配列とArrayListのどちらを使うかは、要素数が変わるかで考えられます。
| 場面 | 選び方 |
|---|---|
| 曜日7個など、個数が固定 | 配列でもよい |
| 買い物やタスクなど、追加・削除する | ArrayListが扱いやすい |
ArrayListも要素を順番に持ちます。重複した値を追加でき、同じ「パン」が2件入ることもあります。
1. 空のリストへ追加する
ArrayListはjava.utilパッケージからimportします。<String>は「このリストには文字列だけを入れる」という指定です。
ArrayList<String> items = new ArrayList<>();
items.add("パン");
items.add("牛乳");
items.add("りんご");
位置を表すindexは0から始まるため、get(0)は「パン」です。
2. 置換して削除する
items.set(1, "豆乳");
items.remove(0);
set(1, ...)で2番目の「牛乳」を「豆乳」へ変えます。その後、remove(0)で先頭の「パン」を削除します。削除後は残った要素のindexが前へ詰まります。
| 操作後 | index 0 | index 1 | index 2 | size |
|---|---|---|---|---|
| 3件追加 | パン | 牛乳 | りんご | 3 |
set(1, "豆乳") | パン | 豆乳 | りんご | 3 |
remove(0) | 豆乳 | りんご | — | 2 |
setは件数を変えず、removeは件数と後ろのindexを変えます。この違いを追うと、範囲外エラーを減らせます。
完成コードを動かす
ArrayListDemo.javaとして保存します。
import java.util.ArrayList;
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList<String> items = new ArrayList<>();
items.add("パン");
items.add("牛乳");
items.add("りんご");
System.out.println("最初の商品: " + items.get(0));
items.set(1, "豆乳");
items.remove(0);
System.out.println("商品数: " + items.size());
for (String item : items) {
System.out.println(item);
}
}
}
javac ArrayListDemo.java
java ArrayListDemo
配列と違い、作成時に要素数を決めていません。addとremoveに合わせてsize()が変わります。
値を指定して削除する書き方もあります。
items.remove("りんご");
remove(0)はindex 0を削除し、remove("りんご")は最初に見つかった同じ値を削除します。ArrayList<Integer>では数値がindexとして解釈される場合があるため、入門では削除対象を確認してから使います。
成功確認
次の順で表示されれば成功です。
最初の商品: パン
商品数: 2
豆乳
りんご
追加後は3件、削除後は2件になり、牛乳が豆乳へ置き換わったことを確認します。
よくあるつまずき
indexを1から数える
最初の要素はget(0)です。3件のリストで使えるindexは0、1、2で、get(3)は範囲外です。
intを型引数へ書く
ジェネリクスにはプリミティブ型を使えません。整数ならArrayList<Integer>と書きます。
ループ中に直接削除する
拡張for文の途中で同じリストをremoveすると例外の原因になります。この入門では、削除を終えてから表示します。
空のリストからgetする
要素がない時のget(0)も範囲外です。取得前にisEmpty()またはsize()で要素があるか確認します。
練習
行きたい場所を入れるArrayList<String>を作ってください。3件追加し、2番目を別の場所へ置換し、最後の1件を削除して、残った場所を順に表示します。
次のステップ
Java入門 #16 - ListとLinkedListで、List型として扱う理由と別の実装を学びます。