7

Java でクラスのカスタム イテレータを実装する方法について少し混乱しています。基本的に、すでに利用可能な組み込みライブラリを使用せずに ArrayList を作成する必要があります。クラス作成の基本は理解していますが、Iterator をこれらすべてに適合させる方法を理解するのに苦労しています。私は次のものを持っています:

次のような反復可能なインターフェイスを実装するジェネリック クラスを作成しました。

public class MyArrayList<T> implements Iterable<T> {

次に、MyIterator というクラスを作成する必要があります。このクラスは、ドキュメントの文言によればスタンドアロン クラスです。MyIterator という名前の新しいクラスを作成し、 iterator インターフェイスを実装して、次のようにします。

public class MyIterator<T> implements Iterator<T>{

私の混乱は次のとおりです。このドキュメントには、Iterator は独自のクラスにある必要があると書かれていますが、「MyArrayList」のデータ メンバーにアクセスして、たとえば hasNext() と next() を完全に実装するにはどうすればよいでしょうか。基になる配列のデータ メンバーはプライベートであるため (そうあるべきです)、外部クラスがこれらのメソッドを完全に実装する方法がわかりません。必要なものを誤解していますか?別のクラスでは、「MyArrayList」クラスの一部ですが、定義が異なりますか?

私が言ったように、私に何が求められているかを理解していると思いますが、イテレーターがこれらすべてのどこに収まるか正確にはわかりません。

4

2 に答える 2

8

イテレータは別のクラス*である必要がありますが、そのクラスはおそらくクラスと何らかの関係がありますIterable

クラスの値にアクセスする必要があるため、ネストされた/内部クラスであることがよくあります (そして、それが内部クラスのほとんどの目的です)。

確かに、が でIterableある場合、 「内部」アクセスをまったく行わずにListを実装できますが、通常は をチェックするなどの目的で内部へのアクセスを取得する必要があります (反復中に が構造的に変更されたときにをスローするため)。 ..そして、それ自体を介して変更した場合にその例外を防ぐため)。IteratormodCountConcurrentModificationExceptionIterableIterator

*インスタンス自体で実装することもできIterableますが、ユーザーが同時に 2 つの反復子を使用するとすぐに契約が破られます。

于 2013-09-04T09:30:49.413 に答える
1

独自のメソッドを宣言する必要がありますhasNext(), next(), remove(). 独自のクラスを反復する方法、次の要素に移動する方法、および次の要素が存在するかどうかを確認する方法を知っている必要があります。

于 2013-09-04T09:26:33.123 に答える