【未経験からのプログラミング講座】STEP3.クラスとオブジェクト4

Pocket

4. コレクション

4.1. コレクション(Listについて)

リストとは、順序付けられたコレクションです。整数値の添え字によって要素にアクセスしたり、リスト内の要素を取得したりすることができます。リストは重複する要素を許可し、また複数のnull要素の挿入も許可します。主に以下の特徴があります。

1)コレクション内のオブジェクトの順番を管理することができる。

2)同じオブジェクトへの参照を複数保持することができる。

3)nullを複数保持することができる。

4.1.1 ArrayList

Listインターフェースを実装する代表的なクラスが、java.util.ArrayListクラスです。サイズが拡張可能な配列型データ構造を持ちます。配列と同じように添え字を使ってオブジェクトへの参照の出し入れを行うことができます。

ArrayListクラスの主なメソッド

メソッド 意味
boolean add (Object o) リストの最後に、指定されたオブジェクトを追加する
Void add(int index, Object o) リストの指定された位置に、指定されたオブジェクトを追加する
object get(int index) 指定された位置にあるリスト内のオブジェクトを取得
int size() リストにある要素数を取得する
object remove(int index) リスト内の指定されたオブジェクトを削除する

サンプル

import java.util.ArrayList;

public class Exm_ArrayList {
    public static void main(String args[]) {

        //ArrayListクラスのオブジェクトを生成
        ArrayList cars = new ArrayList();	

        //Stringクラスである文字列をArrayListクラスに追加
        cars.add("フェラーリ");		//0番目の要素に追加  
        cars.add("ポルシェ");		//1番目の要素に追加
        cars.add("メルセデスベンツ");		//2番目の要素に追加

        //ArrayListに入っている要素数だけ繰り返す
        for(int i = 0; i < cars.size(); i++){
            String str = (String)cars.get(i); 	//ArrayListの要素をString型にキャストして取得
            System.out.println(str); 		//変数strの値を画面上に表示
        }
    }
}

今回はArrayListのオブジェクトcarsにString型の文字列を設定しました。

ここで注意する点は、設定したデータを取り出すには設定した同じ型を使用しキャスト変換を行い取得することです。もし、設定したオブジェクトのクラスや、スパークラス以外でキャスト変換を行うとClassCastExceptionが発生する可能性があります。

実際に上記のExm_ArrayListクラスを実行してみると以下のような実行結果となります。

フェラーリ
ポルシェ
メルセデスベンツ

次に、上記で使用したExm_ArrayListクラスに手を加えてみます。

        cars.remove(1); 			// 1番目の要素を削除
        cars.add(1, "BMW");			// 1番目の要素に追加
        cars.add("フォルクスワーゲン");		// 3番目の要素に追加

        //ArrayListに入っている要素数だけ繰り返す
        for(int i = 0; i < cars.size(); i++){	
            String str = (String)cars.get(i); 	//ArrayListの要素をString型にキャストして取得
            System.out.println(str); 		//変数strの値を画面上に表示
        }
    }
}

上記のように手を加えると実行結果は以下のようになります。

フェラーリ
BMW
メルセデスベンツ
フォルクスワーゲン

Listと同じように順番を管理するものとして、配列が存在しますが、大きな違いが存在します。

以下の表はListと配列との違いをまとめたものです。

List配列可変である (追加・削除により変化する)不変である (最初に定義したまま変わらない)決まったデータ型のみ (最初に定義したまま変わらない)java.lang.Object型であれば何でも可 (取り出す時にキャストが必要)不可能可能

     
要素数    
格納出来る値    
基本データ型の格納 ※1    

※基本データ型:int, long, boolean等

配列は要素数が固定となりますが、使用メモリが少ないという特徴があります。また、Collectionインターフェースを持つクラスは配列よりも使用メモリが多くなりますが、要素を自由に追加・削除できるという特徴があります。プログラムを記述する際は、それぞれの特徴を考えてどちらを使用すべきかを考えてコーディングする必要があります。

問題 3-4-1

果物の名称を持つ配列、Listを使い、二通りの方法で作成してみよう。

4.2. コレクション(Mapについて)

Mapインターフェースは「キー」と「」の対(つい)になる要素を持ったオブジェクトです。マップには同一のキーを複数登録することはできません。しかし、異なるキーで中身の値が同じデータは登録することができます。キーから値を参照するような処理に適しています。主に以下の特徴があります

・ コレクション内のオブジェクトに名前(キー)をつけて管理することができる。

・ 同じオブジェクトへの参照を複数保持することができる。

・ 同一キーを複数登録することはできない。

4.2.1. HashMap

Mapインターフェースを実装する代表的なクラスが、java.util.HashMapクラスです。Mapは要素を「キー(オブジェクトにつけた名前)」を使って管理する点です。また、HashMapはキーの並び順を保持しないという特性を持っています。順番を管理しないので、オブジェクトを追加した順番で取り出すということはできません。(HashtableクラスもHashMapクラスと同じように使えます。)

HashMapの主なメソッド

メソッド 意味
Object put(Object key, Object value) 第一引数のオブジェクトをキーとし、第二引数のオブジェクトを追加する
Object get(Object key) 引数のキーを持つオブジェクトを取得する
Object remove(Object key) 引数のキーを持つオブジェクトを削除する
void clear() Mapから全ての要素を削除する
Int size() 要素数を取得する

サンプル

import java.util.HashMap;

public class Exm_HashMap {

    public static void main(String[] args) {

        //HashMapオブジェクト生成
        HashMap map = new HashMap();

        //Mapにオブジェクトを追加
        map.put("H","水素");
        map.put("O","酸素");
        map.put("C","炭素");

        //キーから値を取得して表示
        System.out.println(map.get("H"));
        System.out.println(map.get("C"));
    }
}

上記のコードは、HashMapオブジェクトの「キー」値に「元素記号」を指定して、キーに対応する値に「元素名」を入れています。まず、8行目でHashMapクラスからHashMapオブジェクトを生成し、11行目〜13行目で生成したHashMapオブジェクトに「キー」と「」を追加しています。16・17行目ではgetメソッドを使い、「キー」値から関連付けられた値を取得して表示させています。

このようにMapデータ構造では、キー値を使って値を参照したい場合に有効です。

実際に上記のExm_HashMapクラスを実行すると以下のような実行結果となります。

水素
炭素

Mapには同一のキーを複数登録することはできませんと説明しました。では、重複したキー値を追加した場合はどうなるのでしょうか?先ほどの例「Exm_HashMap.java」に「重複するキー」を追加するコードを記述してみました。

サンプル

import java.util.HashMap;

public class Exm_HashMap {

    public static void main(String[] args) {

        //HashMapオブジェクト生成
        HashMap map = new HashMap();

        //Mapにオブジェクトを追加
        map.put("H","水素");
        map.put("O","酸素");
        map.put("C","炭素");

        //重複するキーで追加
        map.put("H","スイソ");
        map.put("C","タンソ");

        //キーから値を取得して表示
        System.out.println(map.get("H"));
        System.out.println(map.get("O"));
        System.out.println(map.get("C"));
    }
}

これを実行すると以下のような実行結果となります。

スイソ
酸素
タンソ

上記のように、キー値を重複して追加した場合、キー値に関連付けられた値が上書きされます。上書きされる前のデータ(この場合は「水素」と「炭素」)はHashMapオブジェクトから削除されますので、プログラマはこれらのことを頭に置いてプログラムを組んでいく必要があります。

問題 3-4-2

Mapの性能を把握しながら果物の名前をキーに果物の色を保持するMapを作成し、使用してみよう。