3

を作成するための一般的なアプローチIteratorは次のとおりです。

Iterator iter = myarray.iterator(); 

新しい演算子なしでiterがどのように作成されるかを誰かに教えてもらえますか?私Iteratorはインターフェースであることを知っています、それで誰がそれを実装しますか?

4

8 に答える 8

4

その部分の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       }
于 2012-06-02T15:30:31.643 に答える
4

何が何であるかは示していませんmyarrayが、それが実装を見つけるための鍵です。たとえば、実行時に をmyarray参照すると、プライベートクラスのインスタンスを返す が呼び出されます。(少なくとも、たまたま見た JRE 実装では。)ArrayListArrayList.iterator()ArrayList.Itr

于 2012-06-02T15:29:26.277 に答える
3

の実装の中を見ると、どこかに がiterator()あります。newたとえば、これはiterator()OpenJDK のメソッドArrayListです。

public Iterator<E> iterator() {
    return new Itr();
}

次に、インターフェイスItrを実装するプライベート 内部クラスを参照します。Iterator

private class Itr implements Iterator<E> {
    // implementation details
}
于 2012-06-02T15:29:19.130 に答える
1

myarray.iterator関数です。new演算子は型にのみ適用されます。Skeet氏が回答で述べたように、戻り値は、実装する内部クラスである可能性が高く、メソッドIteratorの実装は内部クラスをiterator()呼び出しますnew

于 2012-06-02T15:33:18.303 に答える
0

まず、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;  
    }
于 2012-06-02T16:07:32.047 に答える
0

イテレータは通常、データ構造のプライベート内部クラスとして実装されるため、そのメソッドを記述して、その構造のデータを適切に反復することができます。したがって、イテレータには、データ構造クラスによって提供されるメソッドを介してのみアクセスできます。

myarray.iterator();
于 2012-06-02T15:35:05.290 に答える
0

インターフェイスを実装する標準ライブラリのコレクション クラスには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.");
        }
      };
    }
  };
}
于 2012-06-02T19:42:38.710 に答える
0

Iterator はインターフェイスであり、ArrayList、Vector、LinkedListなどのListインターフェイスのすべての実装で既に実装されており、その実装について心配する必要はありません。使用するだけです。

于 2012-06-02T16:52:41.513 に答える