要素を反復処理せずに直接取得する方法がないのはなぜですか?イテレータには、カーソルを移動せずに直接getNextElementメソッドを持たない
私は答えを見て、このようないくつかのコピー・貼り付けられた答えを発見した:
それは、現在のIteratorインターフェイスの上に実装することができますが、その使用は稀になるため、それは意味がありません。誰もが実装しなければならないインターフェースにそれを含めること。
この理由は何ですか?
要素を反復処理せずに直接取得する方法がないのはなぜですか?イテレータには、カーソルを移動せずに直接getNextElementメソッドを持たない
私は答えを見て、このようないくつかのコピー・貼り付けられた答えを発見した:
それは、現在のIteratorインターフェイスの上に実装することができますが、その使用は稀になるため、それは意味がありません。誰もが実装しなければならないインターフェースにそれを含めること。
この理由は何ですか?
コレクションインターフェイスは「Iterable」に拡張されています。したがって、すべての実装でイテレータを使用する必要があります。マップ内の要素を直接取得するには、map.get(Key)を使用できます。リスト内の要素を取得するには、indexを使用します。 ListはRandaomAccess Interfaceを実装しているため、キーを直接使用して要素を簡単に取得できます。しかしSetでは、要素を直接取得できません。私が作ろうとしていることは、すべての実装が異なっていることですが、コレクション内のオブジェクトを処理するために必要なすべての実装に共通することが1つあります。この作業はIteratorによって行われます。
JAVAはオブジェクト指向プログラミングを推進しているので、オブジェクト(Iteratorインスタンス)を使用してhasNext()メソッドを呼び出して、要素が存在するかどうか最初にチェックします。 next()を使用して次の要素を取得します。したがって、hasNext()はnullCheckも強制します。
これは、オブジェクト指向の概念と、さまざまな実装で使用される柔軟なabstarctionを促進します。
イテレータは、 カーソルを移動せずに直接getNextElement()メソッドを持たないのですか?
これを説明するために、私は(Iterator
インタフェースを実装する)AbstractList
から採取Iterator
のnext()
方法の以下のコードをとっています。あなたは上記のコードを見れば、あなたが起動しようとした場合getNextElement()
(または同等であるnext()
)インデックスを知らずにIterator
に直接、スローされますので、
public E next() {
try {
//some code
return next;
} catch (IndexOutOfBoundsException e) {
//some code
throw new NoSuchElementException();
}
}
だから、今、あなたは、回答すなわちを取得しますIndexOutOfBoundsException
(NoSuchElementException
で囲まれます)。したがって、これを避けるために、まず次の要素(インデックス)が利用可能であることを確認し(hasNext()
を使用)、コレクションから要素を取得しようとします。
また、あなたはイテレータは、イテレータがコンテナの要素をコンテナ(コレクション)を横断し、アクセスするために使用されているデザインパターンであることに注意する必要がある、あなたはhereを見ることができます。つまり、反復子は、基本的なコレクションの実装について心配することなく、コレクションをループする便利なメソッドを提供します。
イェレーターなので、イテレータですか? – EJP