2012-06-02 73 views
3

一种常见的方式,创建了Iterator是:如何创建迭代器?

Iterator iter = myarray.iterator(); 

谁能告诉我ITER是如何没有新的运营商创造出来的? 我知道Iterator是一个接口,那么谁来实现呢?

+0

哇!你是魔术家伙! :) 非常感谢。 –

回答

3

如果你看看iterator()的实现,那里会有一个new,在某处。例如,这是来自的OpenJDK的ArrayListiterator()方法:

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

反过来,Itr是指实现Iterator接口私有内部类:

private class Itr implements Iterator<E> { 
    // implementation details 
} 
4

您还没有表现出什么myarray是,但这是找到实施的关键。例如,如果myarray在执行时引用ArrayList,则它将调用ArrayList.iterator(),该函数将返回私有类ArrayList.Itr的一个实例。 (至少在我碰巧看到的JRE实现中。)

+0

非常感谢。现在我知道“myarray.iterator()。hasNext();”作品! –

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  } 
1

myarray.iterator是一个函数。 new运算符仅适用于类型。由于Mr. Skeet stated in his answer,返回值很可能是内部类实现Iteratoriterator()方法在内部类上调用new

0

迭代器通常作为数据结构的私有内部类来实现,以便可以编写它的方法来适当地迭代该结构的数据。因此,迭代器将只通过该数据结构类提供了一种方法访问,你的情况

myarray.iterator(); 
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; 
    } 
0

迭代器是一个接口,它已经与列表接口等ArrayList中,向量的每个实施方式实现, LinkedList和其他你不需要担心它的实现只是使用它。

+0

我想我需要担心一些点,否则我不会学习编码,它是如何工作的:) –

0

实现Iterable接口的标准库中的集合类通常具有扩展Iterator的内部类,但这不是必需条件。您可以像任何其他类一样,在任何需要的地方进行子类化和实例化Iterator

这里是我的utils的一个例子,我写了一个方法为给定的数组提供了一个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."); 
     } 
     }; 
    } 
    }; 
}