1. はじめに
これはボーナスレベルの最初の講義です。私たちはすでにオブジェクト指向(OOP)の学習にかなり近づいています。そこで、あなたの興味を少し刺激して、ちょっとだけ先取りしてみましょう 😈。このレベルでは、次の5つの面白いことをお話しします。
- ♾️ “無限”配列を作れるようになります
- 📖 次に「パーソナル辞書」を作ってみます
- 💾 その後、ファイル操作を少しだけ体験します
- 🌐 さらに、インターネットから画像をダウンロードする方法を学びます
- 🛰️ そして最後の講義では、国際宇宙ステーション(ISS)をリアルタイムで追跡します
内部的にどう動いているかは今後のレベルで学びますが、今日は私が用意したツールの使い方を身につけましょう。ワクワクしましたか?それでは始めましょう 😇。
通常の配列をおさらい
まずは Java の通常の配列を思い出しましょう。
int[] arr = new int[10];
とても便利ですが、いくつかの制約があります。サイズは固定で、要素の追加や削除をするには新しい配列を作り直す必要があります。とはいえ、必要に応じて大きくなったり小さくなったりする配列が欲しいときがありますよね。そんなときの解決策が、動的配列の ArrayList です!
ArrayList は自動で拡張・縮小してくれる「賢い配列」です。通常の配列ではサイズが固定ですが、ArrayList は新しい要素を格納できるよう内部の容量を自動で面倒みてくれます。
“無限”配列を作る
私たちの ArrayList を作るには、次のように書きます。
ArrayList<String> array = new ArrayList<String>()
そのあと、要素を追加できます。
array.add("マーシャ");
array.add("カーチャ");
整数用の動的配列を作る
もうお気づきかもしれませんが、動的配列の要素型は山かっこ(<>)で指定します。そこにはプリミティブ型以外の任意の型を指定できます。プリミティブ型を使いたい場合は、そのラッパークラスに置き換えます。
例:
ArrayList<Integer> numbers = new ArrayList<Integer>(); // int
ArrayList<Double> fees = new ArrayList<Double>(); // double
ArrayList<Boolean> yesList = new ArrayList<Boolean>(); // boolean
ArrayList<Character> chars = new ArrayList<Character>(); // char
私たちの ArrayList は要素アクセスに [index] を使いませんが、必要な操作をすべてカバーする専用メソッドが用意されています。主要なものを見ていきましょう。
2. メソッド add(element) — 要素の追加
リストで最初に行うのは、データの追加です。そのためのメソッドが add です。これは要素をリストの末尾に追加します。
ArrayList<String> todo = new ArrayList<>(); // やることリスト
todo.add("ArrayListを学ぶ");
todo.add("お茶を淹れる");
todo.add("散歩する");
この3行のあと、3つの文字列からなるリストができています。配列と違い、サイズを事前に指定する必要はありません — 追加に応じて自動で成長します。
とても便利です。空のリストから始めて、ユーザーの操作やプログラムの入力に応じて少しずつ埋めていけます。
3. メソッド get(index) — インデックスでアクセス
各要素には固有の順序番号 — インデックス があります。インデックスは必ず0から始まります。つまり、最初の要素は 0、2番目は 1 です。
番号で要素を取得したいときは、メソッド get を使います。
String task = todo.get(1);
System.out.println("2つ目のやること: " + task);
出力:
2つ目のやること: お茶を淹れる
重要な注意: 存在しないインデックスにアクセスすると(たとえば、要素が3つのときに todo.get(10))、プログラムは IndexOutOfBoundsException を投げます。したがって、インデックスに自信がある場合を除き、size() でリストのサイズを確認しましょう。
4. メソッド set(index, element) — 要素の置き換え
リスト内の要素を置き換えたいことがあります。この場合、削除して再追加する必要はありません。set メソッドを使えば十分です。
todo.set(1, "コーヒーを淹れる");
System.out.println("今の2つ目のやること: " + todo.get(1));
出力:
今の2つ目のやること: コーヒーを淹れる
このように、set はリストを「その場で」更新する方法です。
5. メソッド remove(index) — 要素の削除
ArrayList では、インデックスを指定して要素を削除できます。
todo.remove(0);
System.out.println("今の1つ目のやること: " + todo.get(0));
出力:
今の1つ目のやること: コーヒーを淹れる
最初の要素(インデックス 0)を削除しました。すると、2番目が1番目になり、かつて3番目だったものが2番目になります。重要なポイントは、削除後にリストの要素が詰められる(前へシフトする)ことです。
初心者には意外に感じられることがあります。削除後はインデックスが再計算されることを常に意識しましょう。
6. メソッド size() — リストのサイズを知る
メソッド size は、リスト内の要素数を返します。配列の length に似ていますが、ArrayList ではメソッドです。
System.out.println("やることの合計: " + todo.size());
出力:
やることの合計: 2
よく size は、すべての要素を走査するループで使われます。
for (int i = 0; i < todo.size(); i++)
{
System.out.println(todo.get(i));
}
7. メソッド contains(element) — 含有チェック
リストに目的の要素があるか調べるには contains を使います。このメソッドは true または false を返します。
System.out.println(todo.contains("散歩する"));
System.out.println(todo.contains("お茶を淹れる"));
出力:
true
false
重複を避けたいときや、「この要素がリストにあるか」を条件としてチェックしたいときにとても便利です。
8. 要素の走査
リストを走査する方法は2つあります。
インデックス付きforループ
要素番号が重要なときに使います。
for (int i = 0; i < todo.size(); i++)
{
System.out.println(i + ": " + todo.get(i));
}
拡張for(for-each)ループ
番号が不要で、すべての要素をただ見たいだけなら for-each を使いましょう。
for (String task : todo)
{
System.out.println("やること: " + task);
}
このループは短く、読みやすいのが利点です。
9. 実践: あなたのアプリでの ArrayList
追加と表示ができるやることリストを作ってみましょう。
import java.util.ArrayList;
import java.util.Scanner;
public class TodoApp
{
public static void main(String[] args)
{
ArrayList<String> todo = new ArrayList<>();
Scanner console = new Scanner(System.in);
while (true)
{
System.out.print("やることを入力してください(空行で終了): ");
String task = console.nextLine();
if (task.isEmpty()) break;
todo.add(task);
}
System.out.println("あなたのやることリスト:");
for (int i = 0; i < todo.size(); i++)
{
System.out.println((i + 1) + ". " + todo.get(i));
}
}
}
この“無限配列”を気に入ってもらえたら嬉しいです。これはあなたが出会う最初の Java コレクションです。ほかのコレクションもきっと気に入るはずです。
GO TO FULL VERSION