Iterator

Java2になってからjava.utilパッケージがかなり充実しました。それまではVectorとHashtableを使って何でもやらなければならなかったのですが、Collectionインタフェースを始めとして、色々なインタフェースと実装クラスが提供されるようになりました。Iteratorもその中の一つで、それまでEnumerationとして提供されていた機能が見直され、より多くのインタフェースに対応するようになりました。Enumerationもまだ使えますが、過去のバージョンとの互換性という位置付けと考えたほうが良いでしょう。

代表的なIteratorの使い方というと、Listインタフェースの各項目に対する処理を行う場合でしょう。例えばリストの各要素を標準出力に出力(toString()を使って)するという場合は、

	/**
	 * リストの各要素を標準出力にtoString()を使って出力する。
	 * @param list 出力対象のリスト。各要素が何かは考えない。
	 */
	public void printList(List list) {
		if (list == null) {
			return;
		}

		// ListインタフェースにはIteratorを作成するメソッドがある。
		Iterator iterator = list.iterator();

		// hasNext()は次の要素のチェックをする
		while (iterator.hasNext() == true) {
			// next()は次の要素を返した上で、Iteratorの参照先を一つ後に
			// ずらせる。
			Object item = iterator.next();
			if (item != null) {
				System.out.println(item.toString());
			}
		}
	}
の様なコードになります。Listインタフェースを使用しているだけなので、Listを実装したどんなクラスでも(ArrayListでもLinkedListでも、自分で作ったものでも)、このコードは使用可能です。

IteratorはEnumerationと異なり、参照先から要素を削除することも出来ます。例えば文字列(String)のリストから特定の文字列要素を削除するには、

	/**
	 * 文字列のリストから、指定した文字列を削除する。
	 * @param list 削除対象のリスト。
	 * @param item 削除しようとする要素。
	 */
	public void removeItem(List list, String item) {
		if (list == null || item == null) {
			return;
		}
		Iterator iterator = list.iterator();
		while (iterator.hasNext() == true) {
			String value = (String)iterator.next();
			if (item.equals(value) == true) {
				// remove()は直前のnext()で取得できたものを削除する。
				iterator.remove();
			}
		}
	}
というように書きます。Iterator#remove()は直前のIterator#next()で取得できた要素を、Iteratorが参照しているCollectionから削除します。next()を呼んだ後、removeを呼ぶ前にもとのListを変更してはいけません。またnext()を呼んだ後にremove()は最大1回だけ呼ぶことが出来ます。

Collectionインタフェースを実装しているクラスは、皆Iteratorを使うことが出来るので、扱いが非常にシンプルになります。


人材開発室 PoisonSoft