イテレータと列挙の主な違いは、イテレータはコレクションの要素を読み出したり削除したりできるのに対し、列挙はコレクションの要素を読み出すことしかできない点です。
コンピュータプログラムは、CPUに特定のタスクを実行させるための命令の集合体です。
プログラマーは、Javaなどの高級プログラミング言語を用いてプログラムを記述することができる。
Javaには、オブジェクトの集合を操作するためのメカニズムがあります。
そのうちの2つがイテレータとエニュメレーションです。
イテレータとは
イテレータは、Javaのコレクションフレームワークのインターフェイスです。
つまり、コレクションの要素を次々に見ていくことができます。
リスト、セット、マップなどの要素をたどることが可能です。
Iteratorを使うと、要素の反復中に呼び出し側が指定されたコレクションから要素を排除することができます。
上のプログラムでは、listというArrayListがあります。
リストへの項目の追加はaddメソッドで行います。
14行目では、リスト内の項目を表示しています。
itrはIterator型であり、iterator()はコレクションの先頭へのイテレータを返している。
whileループでは、hasNext()メソッドを呼び出しています。
これは、コレクションにさらに要素がある場合に真を返します。
さらに要素がある場合は true を返し、ない場合は false を返します。
ループの中では、next() メソッドがコレクション内のすべての要素を取得するのに役立っています。
同様に、itrはコレクション内の要素を読み込んで表示する。
21行目では、itrは最後の要素である3をコレクションから削除している。
最後に、残りの要素である1と2がコンソールに表示される。
列挙とは
列挙とは、オブジェクトのコレクションから一度に1つの要素を取得できるインターフェイスです。
列挙は新しいコードでは時代遅れと考えられています。
しかし、Vectorなどのレガシークラスで定義されているいくつかのメソッドでは、Enumerationが使用されています。
図2:列挙を用いたJavaプログラム
上のプログラムでは、daysはEnumeration型です。
また、dayNamesはVectorのオブジェクトです。
addメソッドは、Vectorに要素を追加するのに役立ちます。
whileループは、Vectorの各要素を通過させるのに役立つ。
hasMoreElements() は、取得する要素が多ければ真を返します。
一方、すべての要素が列挙された場合は、false を返します。
さらに、whileループの中にあるnextElement()メソッドは、列挙された要素の次のオブジェクトを一般的なObjectの参照として返すのに役立ちます。
イテレータとエニュメレーションの違い
定義
Iterator は、Java の Collection フレームワークのインターフェイスで、コレクショ ンを走査することができます。
一方、Enumeration は、オブジェクトのコレクション内の要素を列挙するためのメソッドで構成されるインターフェースです。
アクセス方法
Iteratorでは要素の読み出しと削除が可能ですが、Enumeratorでは要素の読み出しのみ可能です。
メソッド
Iterator は hasNext(), next(), remove() メソッドを提供し、Enumeration は hasMoreElements(), nextElement() メソッドを提供します。
代替品
さらに、プログラマは Iterator の代わりに ListIterator を使用することができ、一方 Enumeration の代わりに Iterator を使用することができます。
結論
簡単に説明すると、IteratorとEnumerationはどちらもJavaのインターフェースで、コレクション内の要素を走査するのに役立ちます。
イテレータとエニュメレーションの主な違いは、イテレータではコレクションの要素を読んだり削除したりできるのに対し、エニュメレーションではコレクションの要素を読むことだけが可能なことです。
さらに、プログラマはListIteratorを使用してコレクションの要素を通過させることもできる。