マイナー・マイナー

隠れた名作の発掘が生きがい。

コレクションに慣れよう


スポンサードリンク

Javaにはコレクションといわれるフレームワークがあります.簡単に言うと,複数の要素を操作・管理する仕組みです.しかし,概要はだいたい分かっていますが,まだ不慣れなため実装したいときにすぐに使えないというのが現状です.そのため,すぐに使えるようなコレクションのサンプルプログラムを作りました.


サンプルプログラムを次に示します.コレクションをインスタンス化し,それに文字をひとつずつセットした後,要素に順次アクセスして初期表示を行うプログラムです.

import java.util.*;

//コメントの"←"は継承,"<--"はインタフェースの実装を表現
public class CollectionTest {

	public static void main(String[] args) {
		String[] stringArray = { "A", "A", "D", "C", "B", "D" };

		// Collection ← List <-- ArrayList
		// 同期化していない.
		List<String> arrayList = new ArrayList<String>();
		setCollection(arrayList, stringArray);
		print("ArrayList", arrayList);

		// Collection ← List <-- Vector
		// 同期化している.
		List<String> vector = new Vector<String>();
		setCollection(vector, stringArray);
		print("Vector", vector);

		// Collection ← List <-- LinkedList
		// Collection ← Queue <-- LinkedList
		// 要素同士が双方向にリンクしている.同期化していない.
		List<String> linkedList = new LinkedList<String>();
		setCollection(linkedList, stringArray);
		print("LinkedList", linkedList);

		// Collection ← Queue <-- PriorityQueue
		// 要素に順序付けがある.同期化していない.
		Queue<String> queue = new PriorityQueue<String>();
		setCollection(queue, stringArray);
		print("PriorityQueue", queue);

		// Collection ← Set <-- HashSet
		// ハッシュコードで要素を管理する.重複を認めない.
		Set<String> hashSet = new HashSet<String>();
		setCollection(hashSet, stringArray);
		print("HashSet", hashSet);

		// Collection ← Set <-- HashSet ← linkedHashSet
		// 順序付きのHashSet要素同士が双方向にリンクしている.
		Set<String> linkedHashSet = new LinkedHashSet<String>();
		setCollection(linkedHashSet, stringArray);
		print("LinkedHashSet", linkedHashSet);

		// Collection ← SortedSet ← NavigableSet <-- TreeSet
		// ソート済み.
		Set<String> treeSet = new TreeSet<String>();
		setCollection(treeSet, stringArray);
		print("TreeSet", treeSet);

		// Map <-- HashTable
		// キー,値ともにnullはできない.同期化している。
		Map<String, String> hashtable = new Hashtable<String, String>();
		setMap(hashtable, stringArray);
		print("Hashtable", hashtable);

		// Map <-- HashMap
		// ハッシュコードでキーを管理する.同期化していない.
		Map<String, String> hashMap = new HashMap<String, String>();
		setMap(hashMap, stringArray);
		print("HashMap", hashMap);

		// Map <-- HashMap ← LinkedHashMap
		// 順序付きのHashMap要素同士が双方向にリンクしている.
		Map<String, String> linkedHashMap = new LinkedHashMap<String, String>();
		setMap(linkedHashMap, stringArray);
		print("LinkedHashMap", hashMap);

		// Map ← SortedMap ← NavigableMap <-- TreeMap
		// ソート済み.
		Map<String, String> treeMap = new TreeMap<String, String>();
		setMap(treeMap, stringArray);
		print("TreeMap", treeMap);
	}

	public static void setCollection(Collection<String> collection,
			String[] stringArray) {
		for (String string : stringArray) {
			collection.add(string);
		}
	}

	public static void setMap(Map<String, String> map, String[] stringArray) {
		for (int i = 0; i < stringArray.length; i++) {
			map.put(Integer.toString(i), stringArray[i]);
			// map.put(stringArray[i], Integer.toString(i));
		}
	}

	public static void print(String collectionName,
			Collection<String> collection) {
		System.out.println(collectionName);
		for (String string : collection) {
			System.out.print(string);
		}
		System.out.println("");
		System.out.println("");
	}

	public static void print(String mapName, Map<String, String> map) {
		System.out.println(mapName);
		System.out.print("keySet : ");
		for (String key : map.keySet()) {
			System.out.print(key);
		}
		System.out.println("");
		System.out.print("values : ");
		for (String string : map.values()) {
			System.out.print(string);
		}
		System.out.println("");
		System.out.println("");
	}
}


実行結果


ArrayList
AADCBD

Vector
AADCBD

LinkedList
AADCBD

PriorityQueue
AADCBD

HashSet
DACB

LinkedHashSet
ADCB

TreeSet
ABCD

Hashtable
keySet : 543210
values : DBCDAA

HashMap
keySet : 352041
values : CDDABA

LinkedHashMap
keySet : 352041
values : CDDABA

TreeMap
keySet : 012345
values : AADCBD


拡張for文を使う際には配列かjava.lang.Iterableを指定する必要があることに注意する必要があります.Collectionインタフェースはjava.lang.Iterableを継承しているため,Collectionインタフェースを実装したArrayListなどは拡張for文に指定できます.しかし,Mapインタフェースはjava.lang.Iterableを継承していないため,Hashtableなどはそのまま拡張for文には指定できません.ただし,MapインタフェースのkeySet,valuesメソッドの戻り値はそれぞれSet,Collectionなので,拡張for文に指定できます.