自分自身のリンクリストタイプのデータ構造を作成しました。リストのノードを反復処理できるIteratorオブジェクトを作成したいと考えています。私自身のイテレータをどのように定義するのですか?
私自身のイテレータを直接定義することは可能ですか、それともLinkedList
のような既存のデータ構造に変換してからiterator()
を呼び出す必要がありますか?
自分自身のリンクリストタイプのデータ構造を作成しました。リストのノードを反復処理できるIteratorオブジェクトを作成したいと考えています。私自身のイテレータをどのように定義するのですか?
私自身のイテレータを直接定義することは可能ですか、それともLinkedList
のような既存のデータ構造に変換してからiterator()
を呼び出す必要がありますか?
あなたはIterator interfaceの3つのメソッドを実装することで、独自のイテレータクラスを定義することができます
boolean hasNext();
E next();
void remove();
最後の方法は任意である:あなたはそれだけでUnsupportedOperationExceptionをスローするように実装することができます。
最も一般的な戦略は、実際のクラスをリストクラスのプライベートメンバークラスにすることです。そうすれば、あなたのクラスの私的簿記データにアクセスすることができます。これはしばしば効率的なイテレータを実装する必要があります。
イテレータクラスを実装したら、通常、リストクラスにIterableを実装すると便利です。これにより、クライアントコードはイテレータを取得することができます。
はい、いずれのクラスもIterable
を実装できます。次に、iterator
からIterator
を実装する別のクラス(前述のように、しばしば内側のクラス)を返します。
ほとんどの場合、かなり簡単です。ただし、特定の質問がある場合はお手伝いできます。 remove
はオプションです。
ListIterator
を実装することもできます。具体的にはリストを対象としています。
「Iterable」はforeachループのためのものだと思いました –
@HunterMcMillen、nope 。これは一般的な使用例ですが、唯一のケースではありません。 –
@HunterMcMillen - それは確かに便利です。しかし、他の用途もあります。 –
Iterator<T>
を実装する独自のクラスを作成することができます。
これは通常、内部クラスで行うのが最も簡単です。
コレクションクラスにIterable<E>
を実装し、iterator()
メソッドからイテレータクラスの新しいインスタンスを返します。
おそらく、List<E>
などの上位コレクションインターフェイスも実装する必要があります。
データ構造の定義を表示できますか? ' Iterator'という新しいクラスを作成し、' Iterator'インターフェースを実装することができます。それでは、 'Iterator'インターフェースに必要な関数を実装するだけです。ここにインターフェイスへのリンクがあります:http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html –