JavaにおけるリストとArrayList
メニューを表示するにはスワイプしてください
Listデータ構造の紹介。以下は、コレクションとリストの階層構造を示すフローチャート。
このセクションでは、特定の種類のコレクションであるリストについて解説。ArrayList、LinkedList、Stackなど、さまざまなリスト型を詳しく説明。
すべてのリストはListインターフェースを継承しているため、親インターフェースを使ってオブジェクトを作成可能。詳細は後述。
まずは、最初のリスト型であるArrayListについて解説。
上記は、ArrayList<>を作成する際の構文。ジェネリクスという部分が登場するが、これは後ほど説明。
現時点では、ArrayListを作成する際に山括弧内でデータ型を指定すること、リストはプリミティブ型には対応していないため、ラッパークラスを使用することを覚えておく。
次に、コードでリストを作成し、add()メソッドを使っていくつかのオブジェクトを追加。
Main.java
1234567891011121314package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numberList = new ArrayList<>(); numberList.add(10); numberList.add(15); numberList.add(5); System.out.println(numberList); } }
ご覧のとおり、add() メソッドは非常にシンプルで、指定した値をリストに追加します。
また、List と ArrayList を java.util ライブラリからインポートする必要があることにも注意してください。ただし、IntelliJ IDEA を使用している場合は、これらのライブラリが自動的にインポートされるため、心配する必要はありません。
次に、独自のデータ型でリストを作成する例を見てみましょう。
Main.java
1234567891011121314151617181920212223242526272829303132333435package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { Dog bob = new Dog("Bob", 2); Dog ben = new Dog("Ben", 1); Dog brian = new Dog("Brian", 5); List<Dog> dogList = new ArrayList<>(); dogList.add(bob); dogList.add(ben); dogList.add(brian); System.out.println(dogList); } } class Dog { String name; int age; public Dog(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
ご覧のとおり、独自のクラスDogを作成し、このデータ型を使用してArrayListを作成しました。リストを出力すると、格納されているすべてのオブジェクトが表示されます。
配列があり、それをリストに変換したい場合はどうすればよいでしょうか?この場合、asList()クラスのArraysメソッドを使用できます。
このメソッドを使うことで、元の配列と同じ要素を持つリストを作成できます。配列にリストのメソッドを適用したいときに特に便利です。構文はシンプルです:
Arrays.asList(arrayName);
また、新しいリストを初期化する際にもすぐに利用できます。例:
Main.java
12345678910111213141516171819202122232425262728293031323334package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { Dog bob = new Dog("Bob", 2); Dog ben = new Dog("Ben", 1); Dog brian = new Dog("Brian", 5); Dog[] dogs = {bob, ben, brian}; List<Dog> dogList = new ArrayList<>(Arrays.asList(dogs)); System.out.println(dogList); } } class Dog { String name; int age; public Dog(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
配列をリストに変換できるのと同様に、toArray()メソッドを使ってリストを配列に変換することも可能。
ArrayList<> のメソッド
基本的なリストメソッドの説明。 これまではリストを配列で簡単に置き換えることができたが、重要な違いはメソッドにある。
add()メソッドはオーバーロードされており、複数のバリエーションが存在。そのうちの一つは、特定のインデックスに要素を追加できる。
リストの途中に要素を挿入すると、右側のすべての要素が新しい要素のために1つ右にシフトする。
例えば、リストの先頭に要素を追加すると、既存のすべての要素が1つ右にシフトする。
例を見てみよう:
Main.java
123456789101112131415161718package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numbers = new ArrayList<>(); for (int i = 0; i < 5; i++) { // Filling `numbers` list with 5 values numbers.add(i); } System.out.println("`numbers` before modifying: " + numbers); numbers.add(2, 10); // Adding 10 on the second index System.out.println("`numbers` after first modifying: " + numbers); numbers.add(0, 5); System.out.println("`numbers` after second modifying: " + numbers); } }
要素を挿入する際に値がどのようにシフトするかは、次の図で視覚的に示されています。
要素の取得
リストにオブジェクトを特定のインデックスに追加できる場合、get(int index)メソッドを使用してインデックスでオブジェクトを取得することも可能です。
例を見てみましょう:
Main.java
12345678910111213141516171819package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<String> names = new ArrayList<>(); names.add("Alice"); names.add("Bob"); names.add("Charlie"); names.add("David"); names.add("Eva"); // Retrieving element by index String element = names.get(2); // Retrieving the 3rd element (index starts from 0) System.out.println("The element at index 2 is: " + element); } }
要素の削除
追加や取得ができるなら、削除も可能です。
もちろんです。remove(int index) メソッドを使って要素を削除できます。
このメソッドはオーバーロードされており、別の方法でも要素を削除できます。remove(Object obj) メソッドを使うと、指定した要素の最初の出現を削除します。
ここで、コース内の全生徒が登録された大きなリストがあると想像してください。しかし、ある生徒が不正行為をして退学処分になりました。その生徒の正確なインデックスが分からないため、名前で削除する必要があります。ただし注意点があります。コードに不具合があり、その名前がリスト内に複数回出現する可能性があります。
この生徒のすべての出現箇所をリストから削除するプログラムを作成しましょう。
Main.java
123456789101112131415161718package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { String[] names = {"Bob", "Alice", "Charlie", "David", "Eva", "Frank", "Grace", "Hank", "Ivy", "Jack", "Katherine", "Leo", "Mia", "Nathan", "Olivia", "Paul", "Quinn", "Rachel", "Sam", "Tom", "Ursula", "Victor", "Wendy", "Xander", "Yvonne", "Zack", "Bob", "Emily", "Bob", "Jake", "Isabel", "Liam", "Nora", "Bob", "Sophia", "Bob", "Daniel", "Gabrielle", "Mike"}; // Expelled student: Bob List<String> students = new ArrayList<>(Arrays.asList(names)); System.out.println("Is Bob present in the list? " + students.contains("Bob")); while (students.contains("Bob")) { students.remove("Bob"); } System.out.println("Is Bob still present in the list after the removal operation? " + students.contains("Bob")); } }
別のリストメソッド—contains(Object obj)—を使用していることにお気付きかもしれません。このメソッドは、指定された要素がリスト内に存在するかどうかを確認し、true または false を返します。
contains() を使うことで、while ループの条件を設定し、"Bob" のような学生をリストからすべて削除することができます。
ちなみに、この処理は removeAll(Collection<?> c) メソッドを使うことで大幅に簡略化できます。
Main.java
123456789101112131415161718package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { String[] names = {"Bob", "Alice", "Charlie", "David", "Eva", "Frank", "Grace", "Hank", "Ivy", "Jack", "Katherine", "Leo", "Mia", "Nathan", "Olivia", "Paul", "Quinn", "Rachel", "Sam", "Tom", "Ursula", "Victor", "Wendy", "Xander", "Yvonne", "Zack", "Bob", "Emily", "Bob", "Jake", "Isabel", "Liam", "Nora", "Bob", "Sophia", "Bob", "Daniel", "Gabrielle", "Mike"}; // Expelled student: Bob List<String> students = new ArrayList<>(Arrays.asList(names)); System.out.println("Is Bob present in the list? " + students.contains("Bob")); List<String> expelledStudents = new ArrayList<>(); expelledStudents.add("Bob"); students.removeAll(expelledStudents); System.out.println("Is Bob still present in the list after the removal operation? " + students.contains("Bob")); } }
removeAll() メソッドは、コレクションをパラメータとして受け取り、そのコレクションに含まれる値を呼び出し元のリストから削除します。
この方法では、退学処分となった学生のコレクションを作成し、"Bob" を追加しました。これにより、コードは簡単に拡張可能となり、今後問題のある学生を退学リストに追加するだけで対応できます。
インデックスによる値の更新
リストのメソッドに戻りましょう。今回は更新メソッドについて説明します。
add() メソッドは新しい値を挿入する際にすべての要素を右にシフトしますが、既存の値をインデックスで更新するには別の方法が必要です。
set(int index, Object value) メソッドがこの処理を行います。
Main.java
12345678910111213141516package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> example = new ArrayList<>(); for (int i = 1; i <= 5; i++) { example.add(i); } System.out.println("List before modification: " + example); example.set(2, 28); System.out.println("List after modification: " + example); } }
とても簡単です。2番目のインデックスの要素を28に置き換えました。
その他のメソッド
最も一般的なメソッドについてはすでに学習しましたが、他にも多くのメソッドがあります。これらはあまり使用されないため、個別には取り上げません。
代わりに、必要なすべてのメソッドと完全なドキュメント、詳細な説明は、IntelliJ IDEAでArrayListクラスを開くことで確認できます。
これを行うには、ArrayListライブラリをインポートし、Command key(Windowsの場合はCtrl)を押しながらArrayListをクリックします。これにより、クラスで利用可能なすべてのフィールドとメソッドが表示され、見逃していたメソッドも確認できます。
1. インデックスで要素を追加するには、どのメソッドを使用できますか?
2. インデックスで要素を取得するには、どのメソッドを使用できますか?
3. 要素の最初の出現を削除するために使用できるメソッドはどれですか?
4. インデックスで要素を置き換えるために使用できるメソッドはどれですか?
5. 要素の存在を確認するために使用できるメソッドはどれですか?
6. 配列からリストを作成できますか?
7. 配列からリストを作成する方法は?
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください