2011-11-27 5 views
3

自分自身のリンクリストタイプのデータ構造を作成しました。リストのノードを反復処理できるIteratorオブジェクトを作成したいと考えています。私自身のイテレータをどのように定義するのですか?

私自身のイテレータを直接定義することは可能ですか、それともLinkedListのような既存のデータ構造に変換してからiterator()を呼び出す必要がありますか?

+0

データ構造の定義を表示できますか? ' Iterator'という新しいクラスを作成し、' Iterator'インターフェースを実装することができます。それでは、 'Iterator'インターフェースに必要な関数を実装するだけです。ここにインターフェイスへのリンクがあります:http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html –

答えて

6

あなたはIterator interfaceの3つのメソッドを実装することで、独自のイテレータクラスを定義することができます

boolean hasNext(); 
E next(); 
void remove(); 

最後の方法は任意である:あなたはそれだけでUnsupportedOperationExceptionをスローするように実装することができます。

最も一般的な戦略は、実際のクラスをリストクラスのプライベートメンバークラスにすることです。そうすれば、あなたのクラスの私的簿記データにアクセスすることができます。これはしばしば効率的なイテレータを実装する必要があります。

イテレータクラスを実装したら、通常、リストクラスにIterableを実装すると便利です。これにより、クライアントコードはイテレータを取得することができます。

0

はい、いずれのクラスもIterableを実装できます。次に、iteratorからIteratorを実装する別のクラス(前述のように、しばしば内側のクラス)を返します。

ほとんどの場合、かなり簡単です。ただし、特定の質問がある場合はお手伝いできます。 removeはオプションです。

ListIteratorを実装することもできます。具体的にはリストを対象としています。

+0

「Iterable」はforeachループのためのものだと思いました –

+0

@HunterMcMillen、nope 。これは一般的な使用例ですが、唯一のケースではありません。 –

+0

@HunterMcMillen - それは確かに便利です。しかし、他の用途もあります。 –

3

Iterator<T>を実装する独自のクラスを作成することができます。
これは通常、内部クラスで行うのが最も簡単です。

コレクションクラスにIterable<E>を実装し、iterator()メソッドからイテレータクラスの新しいインスタンスを返します。

おそらく、List<E>などの上位コレクションインターフェイスも実装する必要があります。

関連する問題