を作成するための一般的なアプローチIterator
は次のとおりです。
Iterator iter = myarray.iterator();
新しい演算子なしでiterがどのように作成されるかを誰かに教えてもらえますか?私Iterator
はインターフェースであることを知っています、それで誰がそれを実装しますか?
を作成するための一般的なアプローチIterator
は次のとおりです。
Iterator iter = myarray.iterator();
新しい演算子なしでiterがどのように作成されるかを誰かに教えてもらえますか?私Iterator
はインターフェースであることを知っています、それで誰がそれを実装しますか?
その部分のArrayListクラスのコード スニペットを次に示します。ご覧のとおり、インターフェイスを実装する内部プライベート クラスがありIterator
、このクラスのインスタンスが返されます。
766 /**
767 * Returns an iterator over the elements in this list in proper sequence.
768 *
769 * <p>The returned iterator is <a href="#fail-fast"><i>fail-fast</i></a>.
770 *
771 * @return an iterator over the elements in this list in proper sequence
772 */
773 public Iterator<E> iterator() {
774 return new Itr();
775 }
776
777 /**
778 * An optimized version of AbstractList.Itr
779 */
780 private class Itr implements Iterator<E> {
781 int cursor; // index of next element to return
782 int lastRet = -1; // index of last element returned; -1 if no such
783 int expectedModCount = modCount;
784
785 public boolean hasNext() {
786 return cursor != size;
787 }
788
789 @SuppressWarnings("unchecked")
790 public E next() {
791 checkForComodification();
792 int i = cursor;
793 if (i >= size)
794 throw new NoSuchElementException();
795 Object[] elementData = ArrayList.this.elementData;
796 if (i >= elementData.length)
797 throw new ConcurrentModificationException();
798 cursor = i + 1;
799 return (E) elementData[lastRet = i];
800 }
801
802 public void remove() {
803 if (lastRet < 0)
804 throw new IllegalStateException();
805 checkForComodification();
806
807 try {
808 ArrayList.this.remove(lastRet);
809 cursor = lastRet;
810 lastRet = -1;
811 expectedModCount = modCount;
812 } catch (IndexOutOfBoundsException ex) {
813 throw new ConcurrentModificationException();
814 }
815 }
816
817 final void checkForComodification() {
818 if (modCount != expectedModCount)
819 throw new ConcurrentModificationException();
820 }
821 }
何が何であるかは示していませんmyarray
が、それが実装を見つけるための鍵です。たとえば、実行時に をmyarray
参照すると、プライベートクラスのインスタンスを返す が呼び出されます。(少なくとも、たまたま見た JRE 実装では。)ArrayList
ArrayList.iterator()
ArrayList.Itr
の実装の中を見ると、どこかに がiterator()
あります。new
たとえば、これはiterator()
OpenJDK のメソッドArrayList
です。
public Iterator<E> iterator() {
return new Itr();
}
次に、インターフェイスItr
を実装するプライベート 内部クラスを参照します。Iterator
private class Itr implements Iterator<E> {
// implementation details
}
myarray.iterator
関数です。new
演算子は型にのみ適用されます。Skeet氏が回答で述べたように、戻り値は、実装する内部クラスである可能性が高く、メソッドIterator
の実装は内部クラスをiterator()
呼び出しますnew
。
まず、myarray
参照からのオブジェクトのクラスは、インターフェイスを実装する必要がありますIterable
。これは、クラスがメソッドに実装を追加する必要があることを意味しIterator iterator()
ます。
簡単にするために、iterator()メソッドは、Iterator
インターフェイスを実装するプライベート内部クラスのオブジェクトを返します。内部クラスは外部クラスのすべてのフィールド(プライベートも含む)にアクセスできるため、このように行われます。
これが逆配列イテレータの例です
class ReverseArray implements Iterable{
private Object[] data;// some data to iterate
public ReverseArray(Object[] data) {
this.data=data;
}
private class ReverseIterator implements Iterator {
int counter = data.length;
public boolean hasNext() {
if(counter>0)
return true;
else
return false;
}
public Object next() {
return data[--counter];
}
public void remove() {
//TODO Auto-generated method stub
}
}
public Iterator<Integer> iterator() {
return new ReverseIterator();
}
}
それをテストしましょう
public static void main(String[] args) {
ReverseArray reverseArray=new ReverseArray(new Integer[]{1,2,3,4,5});
for(Object i:reverseArray)
System.out.print(i+"; ");
//OUT: 5; 4; 3; 2; 1;
}
イテレータは通常、データ構造のプライベート内部クラスとして実装されるため、そのメソッドを記述して、その構造のデータを適切に反復することができます。したがって、イテレータには、データ構造クラスによって提供されるメソッドを介してのみアクセスできます。
myarray.iterator();
インターフェイスを実装する標準ライブラリのコレクション クラスにはIterable
通常、 を拡張する内部クラスがありますがIterator
、これは必須ではありません。Iterator
他のクラスと同様に、好きな場所でサブクラス化してインスタンス化できます。
Iterable
これは、特定の配列のインスタンスを提供するメソッドを記述したユーティリティの例です。
public static Iterable<A> asIterable(final A[] xs) {
return new Iterable<A>() {
@Override
public Iterator<A> iterator() {
return new Iterator<A>() {
private int i = 0;
@Override
public boolean hasNext() {
return i < xs.length;
}
@Override
public A next() {
A x = xs[i];
i++;
return x;
}
@Override
public void remove() {
throw new UnsupportedOperationException(
"Cannot remove an element from an array.");
}
};
}
};
}
Iterator はインターフェイスであり、ArrayList、Vector、LinkedListなどのListインターフェイスのすべての実装で既に実装されており、その実装について心配する必要はありません。使用するだけです。