感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

【プログラミング 104.5時間目】Java コレクションのまとめ

スポンサーリンク

■マップ
・マップの抽象的な意味はキーと値の対応の集まりを管理するモノ
・マップのキーと値にはそれぞれ任意の参照型オブジェクトが使える

Mapインターフェースの代表的なメソッド
containsKey:指定したキーの存在チェック
containsValue:指定した値の存在チェック
entrySet:要素全体をなめる処理に使う
get:指定したキーから値を検索
keySet:キーの集合を取得
put:キーと値のペアを追加
remove:キーと値のペアを削除
size:要素数
values:値の集合を取得

Map<String,Integer> map = new HashMap<String,Integer>;

Mapインターフェースを実装する具象クラスは3つ
・HashMap
・LinkedHashMap
・TreeMap

ハッシュ関数とは、入力値を一定の決まった範囲の数値に変換する関数のこと。

package collection;

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

public class MapSample {
	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>();
		map.put("ito","mizky");
		map.put("hosaka","takaky");
		map.put("matsumoto", "koyo");

		System.out.println(map.get("ito"));
		System.out.println(map.get("hosaka"));
		System.out.println(map.get("matsumoto"));
	}
}

結果

mizky
takaky
koyo

■セット
セットは数学の「集合」の概念をプログラミングに持ち込んだもの。
その抽象的な意味は、「重複のない要素の集まり」

Setインターフェースの代表的なメソッド一覧
add:要素の追加
contains:要素の存在チェック
remove:要素を削除
size:要素数

Setインターフェースを実装した具象クラスは次の通り。
・HashSet
・LinkedHashSet
・TreeSet

Setのサンプル

package collection;

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

public class SetSample {
	public static void main(String[] args) {
		Set<String> set = new HashSet<String>();
		set.add("mizky");
		set.add("takaky");
		set.add("yoneda");
		set.add("naoki");
		set.add("tenshin");
		boolean b1 = set.add("toshi");
		System.out.println(b1); //true
		boolean b2 = set.add("mizky");
		System.out.println(b2);  //false

		System.out.println("---------------");
		//要素をすべて列挙する
		for (String e : set) {
			System.out.println(e);
		}
	}
}

結果

true
false
---------------
tenshin
naoki
toshi
yoneda
takaky
mizky

繰り返し処理を英語でイテレーション(iteration)と呼ぶ。
■リストに対する繰り返しの処理の3パターン

//拡張for構文を使うパターン
for (Integer n : list) {
	sum += n;
}

//イテレータを使うパターン
for (Iterator<Integer> it = list.iterator(); it.hasNext(); ) {
	Integer n = it.next();
	sum += n;
}

//インデックスでforループを回すパターン
for (int i = 0; i < list.size(); i++) {
	Integer n = list.get(i);
	sum += n;
}

最後の「インデックスでforループを回すパターン」はパーフェクトJavaでは推奨していない。
なぜかというと、インデックスでfor文を回すというのは、「コレクションオブジェクトにインデックスでアクセスできること」を前提にしている。
換言すると、「要素が順序をもって並んでいること」に"依存”してしまっている。
コレクションはモノの集まりを抽象化したモノなので、要素が順序を持って並ぶことは規定していない。
インデックスでforループをまわすコードは、コレクション一般に適用できるコードではなく、リストにのみ適用可能な繰り返し処理である。


拡張for構文はイディオムとして定着しているため、特別な理由がない限り、拡張for構文で記述する。
このような簡易記法を、プログラミングではシンタックスシュガーという。

Iteratorインターフェースが持つメソッド
・boolean hasNext(); 次に取り出す要素があるか調べる
・E next(); まだ取り出していない次の要素を取り出す
・void remove(); nextで取り出した要素をコレクションから削除する

イテレータでSetの要素を取り出す

package collection;

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

public class SetSample {
	public static void main(String[] args) {
		Set<String> set = new HashSet<String>();
		set.add("mizky");
		set.add("takaky");
		set.add("yoneda");
		set.add("naoki");
		set.add("tenshin");
		boolean b1 = set.add("toshi");
		System.out.println(b1); //true
		boolean b2 = set.add("mizky");
		System.out.println(b2);  //false

		System.out.println("---------------");

		for (String e : set) {
			System.out.println(e);
		}

		System.out.println("---------------");
		//Iteratorで取り出す
		for (Iterator<String> it = set.iterator(); it.hasNext();) {
			String s = it.next();
			System.out.println(s);
		}
	}
}

結果

true
false
---------------
tenshin
naoki
toshi
yoneda
takaky
mizky
---------------
tenshin
naoki
toshi
yoneda
takaky
mizky

コレクションの要素を逆方向に列挙したい場合は、ListIteratorインターフェースを使用する

for (ListIterator<String> it = list.listIterator(list.size()); it.hasPrevious(); ) {
	String s = it.previous();
	System.out.println(s);
}

Java5より以前は
List list = new ArrayList();
みたいに非ジェネリックな書き方であったが、これだと要素を取り出すときにダウンキャストが必要になる。
Java5以降は、コレクションの要素の型は必ず指定する。

<参考>

パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)

パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)