2016-11-13 7 views
1

要素を反復処理せずに直接取得する方法がないのはなぜですか?イテレータには、カーソルを移動せずに直接getNextElementメソッドを持たない

私は答えを見て、このようないくつかのコピー・貼り付けられた答えを発見した:

それは、現在のIteratorインターフェイスの上に実装することができますが、その使用は稀になるため、それは意味がありません。誰もが実装しなければならないインターフェースにそれを含めること。

この理由は何ですか?

+0

イェレーターなので、イテレータですか? – EJP

答えて

0

コレクションインターフェイスは「Iterable」に拡張されています。したがって、すべての実装でイテレータを使用する必要があります。マップ内の要素を直接取得するには、map.get(Key)を使用できます。リスト内の要素を取得するには、indexを使用します。 ListはRandaomAccess Interfaceを実装しているため、キーを直接使用して要素を簡単に取得できます。しかしSetでは、要素を直接取得できません。私が作ろうとしていることは、すべての実装が異なっていることですが、コレクション内のオブジェクトを処理するために必要なすべての実装に共通することが1つあります。この作業はIteratorによって行われます。

JAVAはオブジェクト指向プログラミングを推進しているので、オブジェクト(Iteratorインスタンス)を使用してhasNext()メソッドを呼び出して、要素が存在するかどうか最初にチェックします。 next()を使用して次の要素を取得します。したがって、hasNext()はnullCheckも強制します。

これは、オブジェクト指向の概念と、さまざまな実装で使用される柔軟なabstarctionを促進します。

-1

イテレータは、 カーソルを移動せずに直接getNextElement()メソッドを持たないのですか?

これを説明するために、私は(Iteratorインタフェースを実装する)AbstractListから採取Iteratornext()方法の以下のコードをとっています。あなたは上記のコードを見れば、あなたが起動しようとした場合getNextElement()(または同等であるnext())インデックスを知らずにIteratorに直接、スローされますので、

public E next() { 
     try { 
      //some code 
      return next; 
     } catch (IndexOutOfBoundsException e) { 
      //some code 
      throw new NoSuchElementException(); 
    } 
} 

だから、今、あなたは、回答すなわちを取得しますIndexOutOfBoundsExceptionNoSuchElementExceptionで囲まれます)。したがって、これを避けるために、まず次の要素(インデックス)が利用可能であることを確認し(hasNext()を使用)、コレクションから要素を取得しようとします。

また、あなたはイテレータは、イテレータがコンテナの要素をコンテナ(コレクション)を横断し、アクセスするために使用されているデザインパターンであることに注意する必要がある、あなたはhereを見ることができます。つまり、反復子は、基本的なコレクションの実装について心配することなく、コレクションをループする便利なメソッドを提供します。

関連する問題