Mapインターフェース

コレクションフレームワークに属するMapインターフェースはListインターフェースと違い、0から始まるインデックスではなくキーとバリューを一対にして要素を管理します。mapインスタンスの宣言はジェネリックの< >の中にキーとバリューの型をカンマ区切りで指定し、要素の登録はputメソッド、取り出しはgetメソッドで行います。
要素の登録では同じキーの複数登録はできませんが、キーが違えば同じバリューの複数登録は可能です。

要素を連続して取り出すには、keySetメソッドでキーの一覧をSetオブジェクトに取り出し、Setオブジェクトから拡張for文でキーを順次取り出しながら、getメソッドでバリューを取出します。下記HashMapを使ったサンプルの15行目から18行目及び21行目から24行目を参照)

Mapインターフェースの実装の一つがHashMapです。
HashMapはハッシュを使って、要素の保存場所を決定するので、要素の追加・削除・変更という操作が、要素の数に関わらず一定の時間で実行可能です。

import java.util.Map;
import java.util.Set;
import java.util.HashMap;

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

		Map<Integer, String> map=new HashMap<>( ); 
		System.out.println(map.size());
		System.out.println("---------------");
		map.put(1, "Bach");
		map.put(10, "Chopin");
		map.put(100, "Anonymous");
		
		Set<Integer> keys = map.keySet();
		for(int key: keys) {
			System.out.println("key:" + key + " value:" + map.get(key));
		}
		System.out.println("---------------");
		map.put(101, "Anonymous");
		keys = map.keySet();
		for(int key: keys) {
			System.out.println("key:" + key + " value:" + map.get(key));
		}
		System.out.println("---------------");
		System.out.println("Map contains key:10 (\"Chopin\"):" + map.containsKey(10));
		map.remove(100, "Anonymous");
		System.out.println(map.size());
		System.out.println(map);
	}
}

実行結果
>java HashMapSample
0
—————
key:1 value:Bach
key:100 value:Anonymous
key:10 value:Chopin
—————
key:1 value:Bach
key:100 value:Anonymous
key:101 value:Anonymous
key:10 value:Chopin
—————
Map contains key:10 (“Chopin”):true
3
{1=Bach, 101=Anonymous, 10=Chopin}

>

また、別の実装としてTreeMapクラスがあります。
基本的な仕様はHashMapと変わりませんが、要素を辞書順にソートして管理します。
実行結果の最後のmap内の要素の呼び出し結果をHashMapのそれと比較してください。

import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

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

		Map<Integer, String> map=new TreeMap<>( ); 
		System.out.println(map.size());
		System.out.println("---------------");
		map.put(1, "Bach");
		map.put(10, "Chopin");
		map.put(100, "Anonymous");
		
		Set<Integer> keys = map.keySet();
		for(int key: keys) {
			System.out.println("key:" + key + " value:" + map.get(key));
		}
		System.out.println("---------------");
		map.put(101, "Anonymous");
		keys = map.keySet();
		for(int key: keys) {
			System.out.println("key:" + key + " value:" + map.get(key));
		}
		System.out.println("---------------");
		System.out.println("Map contains key:10 (\"Chopin\"):" + map.containsKey(10));
		map.remove(100, "Anonymous");
		System.out.println(map.size());
		System.out.println(map);
	}
}

実行結果
>java TreeMapSample
0
—————
key:1 value:Bach
key:10 value:Chopin
key:100 value:Anonymous
—————
key:1 value:Bach
key:10 value:Chopin
key:100 value:Anonymous
key:101 value:Anonymous
—————
Map contains key:10 (“Chopin”):true
3
{1=Bach, 10=Chopin, 101=Anonymous}

>

コレクション に戻る

Setインターフェース

コレクションフレームワークに属するSetインターフェースはListインターフェースと違い、要素を追加した順番を管理しません。また、同じ値のオブジェクトはセットの中に複数追加できません
指定の要素が集合の中にあるか否かを素早く確認するなどに有効です。
0から始まるインデックスを持たないため、要素の取り出しには拡張for文、またはiteratorだけが使用できます。

Listインターフェースの実装にはHashSetとTreeSetがあります。

まずHashSetクラスですが、これはハッシュを使って、要素の保存場所を決定するので、要素の追加・削除が、要素の数に関わらず一定の時間で実行できます。

import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;

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

		Set<String> set=new HashSet<>( ); 
		System.out.println(set.size());
		System.out.println("---------------");
		set.add("Bach");
		set.add("Chopin");
		set.add("Anonymous");
		for(String str: set) {
			System.out.println(str);
		}
		System.out.println("---------------");
		set.add("Anonymous");
		for(Iterator<String> it = set.iterator(); it.hasNext();) {
			System.out.println(it.next());
		}
		System.out.println("---------------");
		System.out.println("Set contains \"Chopin\":" + set.contains("Chopin"));
		set.remove("Anonymous");
		System.out.println(set);
	}
}

実行結果です。
0
—————
Chopin
Bach
Anonymous
—————
Chopin
Bach
Anonymous
—————
Set contains “Chopin”:true
[Chopin, Bach]

>

次はTreeSet
基本的な仕様はHashSetと変わりませんが、要素を辞書順にソートして管理します。

import java.util.Set;
import java.util.TreeSet;
import java.util.Iterator;

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

		Set<String> set=new TreeSet<>( ); 
		System.out.println(set.size());
		System.out.println("---------------");
		set.add("Bach");
		set.add("Chopin");
		set.add("Anonymous");
		for(String str: set) {
			System.out.println(str);
		}
		System.out.println("---------------");
		set.add("Anonymous");
		for(Iterator<String> it = set.iterator(); it.hasNext();) {
			System.out.println(it.next());
		}
		System.out.println("---------------");
		System.out.println("Set contains \"Chopin\":" + set.contains("Chopin"));
		set.remove("Anonymous");
		System.out.println(set);
	}
}

実行結果です。
>java SetSample
0
—————
Anonymous
Bach
Chopin
—————
Anonymous
Bach
Chopin
—————
Set contains “Chopin”:true
[Bach, Chopin]

>

コレクション に戻る

コレクション フレームワーク

通常、複数のオブジェクトを管理するために配列を使います。しかし、配列は事前に配列の次元や要素の数を決めなければいけないなど、オブジェクトの動的な管理には適しません

これに対し、コレクションには配列にない、いくつかの特徴があります

初期化で要素数を指定する必要がない。
要素の追加・削除・挿入がメソッドを呼ぶことにより自由に行える。
要素のソーティングや検索がメソッドで可能。
コレクションはいくつかのインターフェースで仕様が決められているので、利用するクラスが異なっても同じ仕様のメソッドを利用して要素を管理することが出来る。
ただし、管理できるのは参照型のオブジェクトだけで基本型のデータは扱えない。必要な場合はラッパークラスとして定義し、AutoBoxingで自動変換して扱う。
コレクションフレームワークは性質の若干異なるList、Set、Mapなどにより構成され、それぞれにインターフェースが定義され、それぞれを実装したクラスが用意されているので、実際の課題ごとに適切はクラスを選択して使います。

コレクションフレームワークの構造

それぞれの特徴、利用法は下記を参照してください。
Listインターフェース
Setインターフェース
Mapインターフェース

以上でコレクションフレームワークの仕様と基本的な利用法は理解できたと思いますが、コレクションは「参照型のオブジェクト」を管理する仕組み、という実際の利用効果を見てみましょう。
参照型のオブジェクトとは簡単に言えばクラスですから、クラスのインスタンスを集めて管理できるという事です。さらに、クラスが継承関係を持っていれば、スーパクラスと合わせてサブクラスのインスタンスも合わせて一括管理が出来るという事です。
それでは、電話番号を管理するPhoneクラスを作り、継承によって電話番号と合わせてEmailアドレスも管理するmobileクラスを作って、それらのインスタンスをListArrayに入れて一括管理し、Phoneとmobileを使い分けながら利用するところを見てみましょう。
まず、Phoneクラス

public class Phone {
	private String no;
	
	public Phone(String myNo) {
		this.no = myNo;
	}
	
	public String getNo() {
		return no;
	}
	public void setNo(String no) {
		this.no = no;
	}
	
	public void call(String to) {
		System.out.println("電話番号" + no + "番から、電話番号" + to + "番に電話しました。");
	}
}

次に、Phoneクラスを継承したMobileクラス

public class Mobile extends Phone {
	private String emAdd;
	
	public Mobile(String no, String myEmAdd) {
		super(no);
		this.emAdd = myEmAdd;
	}
	
	public String getEmAdd() {
		return emAdd;
	}
	public void setEmAdd(String emAdd) {
		this.emAdd = emAdd;
	}
	
	public void mobileInfo() {
		System.out.println("私の携帯の電話番号は" + super.getNo() + "番で、メールアドレスは" + emAdd + "です。");
	}
	public void send(String to) {
		System.out.println("メールを" + emAdd + "から、" + to + "に送信しました。");
	}
}

さらに、PhoneクラスとMobileクラスを一括管理して使う処理です。

import java.util.*;

public class MyPhones {
	public static void main(String[] args) {
		List<Phone> pList = new ArrayList<>();
		
		pList.add(new Phone("0123-45-6789"));
		pList.add(new Mobile("090-8765-4321", "abcd@efgh.ijk.lm"));
		pList.add(new Phone("0234-56-7890"));
		
		System.out.println(pList);
		
		for(Phone use : pList) {
			use.call("0120-333-4444");
		}
		System.out.println("-----------------------");
		Mobile mbl = (Mobile)pList.get(1);
		mbl.mobileInfo();
		mbl.send("opqr@stu.vw.xyz");
	}
}

実行結果

>java MyPhones
[Phone@15db9742, Mobile@6d06d69c, Phone@7852e922]
電話番号0123-45-6789番から、電話番号0120-333-4444番に電話しました。
電話番号090-8765-4321番から、電話番号0120-333-4444番に電話しました。
電話番号0234-56-7890番から、電話番号0120-333-4444番に電話しました。
-----------------------
私の携帯の電話番号は090-8765-4321番で、メールアドレスはabcd@efgh.ijk.lmです。
メールをabcd@efgh.ijk.lmから、opqr@stu.vw.xyzに送信しました。

>
以上が、クラスのインスタンスを集めて管理し、一括されたそれらの情報を利用する、配列とは違ったコレクションの利点です。

コレクション に戻る

Listインターフェース

コレクションフレームワークに属するListインターフェースは配列と同じように0からのインデックスで要素の集まりを扱います。
配列との大きな差は配列は要素の追加が出来ないのに対し、Listインターフェースは要素の追加・削除が可能なことです。
Listインターフェースのメソッドのうち、addメソッドは指定された要素をリストの最後に追加し、clearメソッドは指定された全ての要素をリストから削除し、removeメソッドは指定された要素をリストの先頭から探し、最初に見つかった同じ要素をリストから削除し、setメソッドはリスト内の指定された位置にある要素を、指定された要素に置き換えます。なお、addメソッドにはリスト内の指定された位置に、指定された要素を挿入するメソッド、removeメソッドには指定された位置にある要素を削除するメソッドもあります。
Listインターフェースの実装クラスで良く用いられるのはArrayListクラスです。
なお、ArrayListの宣言では扱う要素の型をジェネリックとして< >の中に記述し、それ以外の型のオブジェクトが追加されないようコンパイラーにチェックさせます。
また、要素の取り出しにはfor文、拡張for文、iteratorを使用します。
Listの実装クラスにArrayListを利用した例

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;

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

		List<String> list=new ArrayList<>( ); 
		System.out.println(list.size());
		System.out.println("---------------");
		list.add("B");
		list.add("C");
		list.add(0, "A");
		for(int i=0; i<list.size(); i++) {
			System.out.println(list.get(i));
		} 
		System.out.println("---------------");
		list.add("A");
		for(String str: list) {
			System.out.println(str);
		}
		System.out.println("---------------");
		list.set(3, "D");
		for(Iterator<String> it = list.iterator(); it.hasNext();) {
			System.out.println(it.next());
		}
		System.out.println("---------------");
		list.remove(0);
		System.out.println(list);
	}
}

実行結果

>java ListSample
0
---------------
A
B
C
---------------
A
B
C
A
---------------
A
B
C
D
---------------
[B, C, D]

>

Listインターフェースを実装したクラスには、ArrayListのように要素を連続的に並べるのではなくリンク情報で関連付けたLinkedListがあります。LinkedListの機能はArrayListと変わりませんがリンク情報の書き換えで要素の挿入、削除が行えるのでArrayListよりもそれらの処理が早く行えます。しかし、逆に、連続的に要素を扱う読出しや書き込みはArrayListよりも処理が遅くなります。

Listの実装クラスにLinkedListを利用した例

import java.util.List;
import java.util.LinkedList;
import java.util.Iterator;

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

		List<String> list=new LinkedList<>( ); 
		System.out.println(list.size());
		System.out.println("---------------");
		list.add("B");
		list.add("C");
		list.add(0, "A");
		for(int i=0; i<list.size(); i++) {
			System.out.println(list.get(i));
		} 
		System.out.println("---------------");
		list.add("A");
		for(String str: list) {
			System.out.println(str);
		}
		System.out.println("---------------");
		list.set(3, "D");
		for(Iterator<String> it = list.iterator(); it.hasNext();) {
			System.out.println(it.next());
		}
		System.out.println("---------------");
		list.remove(0);
		System.out.println(list);
	}
}

実行結果
同じインターフェースを実装しているので実行結果に違いはありません。

>java ListSample
0
---------------
A
B
C
---------------
A
B
C
A
---------------
A
B
C
D
---------------
[B, C, D]

>

コレクション に戻る

Kichu - Proudly powered by WordPress