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を使うことが出来るので、扱いが非常にシンプルになります。