21.
Collection
ミュータブルとイミュータブル
イミュータブル(immutable)
Array型のように新しい値を追加したり・削除できないなどデータの数を変えられない状態(不変データ)を、イミュータブル(immutable) といいます。
ミュータブル(mutable)
イミュータブルでなく、新しい値を追加したり・削除できる状態(可変データ)をミュータブル(mutable) といいます。
Collection
Collection(コレクション)とは
コレクションはデータ要素を1つにまとめるクラスで、ミュータブル(mutable)なのでデータ追加、更新、検索などの操作ができます。
Collectionのイメージ
name | job | hp | mp | attackPower | defencePower | |
---|---|---|---|---|---|---|
アリス | wizard | 30 | 0 | 10 | 5 | |
ボブ | warrior | 10 | 20 | 3 | 5 | |
新規データ追加→ | テリー | wizard | 30 | 0 | 10 | 5 |
コレクションの種類
Collection(コレクション)はおおきく「List」「Set」「Queue」などにわかれます。
項目 | インターフェイス | パッケージ | クラス | 特徴 |
---|---|---|---|---|
リスト | List | java.util.List | List | 順序どおりに並ぶ |
セット | Set | java.util.Set | hashSet | 順序どおりではない |
キュー | Queue | java.util.Queue | PriorityQueue | 追加、取得、検査 |
デック | Deque | java.util.Deque | ArrayDeque | Queueを拡張したもの |
List
Listの定義
Listは、index(要素番号)で指定したコレクションで、変数のデータ型を < > で囲んで宣言します。
List<データ型> 変数名;
データの初期化
Arrays.asList() でListデータ初期化できます。
List<データ型> 変数名 = Arrays.asList(データ1, データ2, ....);
ArrayList
Listを拡張したクラスに「ArrayList」「LinkedList」があり、それぞれ特徴があります。
クラス | パッケージ | 特徴 |
---|---|---|
ArrayList | java.util.ArrayList | データアクセス・検索が高速 |
LinkedList | java.util.LinkedList | データお追加・削除などが高速 |
ArrayListの変数定義
ArrayListの変数定義は以下のようになります。
ArrayList<データ型> 変数名;
ArrayListの初期化
new ArrayList<>() でデータ初期化します。データの代入は Arrays.asList() を利用します。
データ付き初期化
ArrayListを初期化で直接データを入れる場合、Arrays.asList() を使うこともできます。
ArrayList<データ型> 変数名 = new ArrayList<>(Arrays.asList(値1, 値2, 値3 ...))
ArrayListの定義
ファイル構成
src/character/
├── App2.java
├── Character.java
├── Wizard.java
└── Warrior.java
メインプログラム「App2.java」を作成し、Character型のArrayListを定義します。
App2.java
package character;
import java.util.ArrayList;
import java.util.Arrays;
public class App2 {
public static void main(String[] args) {
ArrayList<Character> characterList = new ArrayList<Character>();
}
}
add()
add() で、リストの最後にデータを追加します。
ArrayList.add(値)
ArrayListのデータ追加
ArrayList型のCharacterリストを定義し、add()でキャラクターデータを追加します。
App2.java
package character;
import java.util.ArrayList;
import java.util.Arrays;
public class App2 {
public static void main(String[] args) {
ArrayList<Character> characterList = new ArrayList<Character>();
characterList.add(new Wizard("アリス"));
characterList.add(new Wizard("テリー"));
characterList.add(new Warrior("ボブ"));
}
}
データの表示
for文でCharacterリストを繰り返して、キャラクター名を表示してみましょう。
public static void main(String[] args) {
ArrayList<Character> characterList = new ArrayList<Character>();
characterList.add(new Wizard("アリス"));
characterList.add(new Wizard("テリー"));
characterList.add(new Warrior("ボブ"));
for (Character character : characterList) {
System.out.println(character.name);
}
}
結果
アリス
テリー
ボブ
size()
size() でArrayListのデータ個数を確認してみましょう。
int dataCount = characterList.size();
System.out.println(dataCount);
結果
リストデータが3個になりました。
3
get()
ArrayListクラスのget() で、インデックス指定した値を取得できます。
ArrayList.get(index)
「characterList」から index=1 の値を取得して、コンソール表示してみましょう。
Character selectCharacter = characterList.get(1);
System.out.println(selectCharacter.name);
結果
テリー
set()
set() は、リストから指定したインデックスのデータを更新します。
ArrayList.set(index, データ)
characterList.set(0, new Warrior("スミス"));
for (Character character : characterList) {
System.out.println(character.name);
}
結果
ArrayListの最後のデータが削除したことを確認しましょう。
スミス
テリー
ボブ
remove()
remove() は、リストから指定したインデックスのデータを削除します。
ArrayList.remove(index)
最後のデータを削除
リストの最後のデータを取得します。データの個数から1引いた値がインデックスになります。
int lastIndex = dataCount - 1;
characterList.remove(lastIndex);
結果
ArrayListの最後のデータが削除したことを確認しましょう。
スミス
テリー
clear()
removeAll()は、すべてのデータを削除します。
characterList.clear();
System.out.println(characterList.size());
結果
データの個数が0になりました。
0
データ付きで初期化
Arrays.asList()で、最初にデータを初期化もできます。
ArrayList<Character> characterList = new ArrayList<>(
Arrays.asList(
new Wizard("アリス"),
new Wizard("テリー"),
new Warrior("ボブ"))
);
}
LinkedList
LinkedListとは
LinkedListは基本的にArrayListと同じデータ構造ですが、データの追加、削除が高速なのが特徴です。
LinkedListのデータ追加
データの追加、削除をメインするのであれば、LinkedListを利用してもよいでしょう。
LinkedList<データ型>変数 = new LinkedList<>();
LinkedListはArrayList同様に、add()、remove() で処理できます。
演習
「shop」パッケージに「Drink」クラスを作成して回答してください。
Drink.java
package shop.item;
public class Drink {
public String name;
public int price;
public int stock;
public Drink(String name, int price, int stock) {
this.name = name;
this.price = price;
this.stock = stock;
}
}
問題1
ミュータブル(mutable)とは、どんな特徴のオブジェクトですか?
- データをあとから追加できないオブジェクト
- データをあとから追加できるオブジェクト
- データを読み込めるオブジェクト
- データを読み込めないオブジェクト
問題2
つぎの表から、ArrayListのデータ「drinkList」を作成し、コンソールに一覧表示してみましょう。
name | price | stock |
---|---|---|
コーヒー | 350 | 100 |
紅茶 | 400 | 10 |
ほうじ茶 | 300 | 50 |
問題3
「drinkList」から「紅茶」をコンソール表示してみましょう。
問題4
「drinkList」につぎの追加してみましょう。
name | price | stock |
---|---|---|
コーラ | 300 | 100 |
問題5
「drinkList」の「コーヒー」を、つぎデータで更新してみましょう。
name | price | stock |
---|---|---|
アイスコーヒー | 250 | 50 |
問題6
「drinkList」から「ほうじ茶」を削除してみましょう。