2009-06-10 15 views
41

Penso che la maggior programmatori hanno usato codice come il seguente:Come posso utilizzare java per ogni ciclo con classi personalizzate?


ArrayList<String> myStringList = getStringList(); 
for(String str : myStringList) 
{ 
    doSomethingWith(str); 
} 

Come posso approfittare della per ogni ciclo con le mie lezioni? Esiste un'interfaccia che dovrei implementare?

risposta

48

È possibile implementare Iterable.

Ecco uno example. Non è il massimo, poiché l'oggetto è il suo iteratore. Tuttavia dovrebbe darti un'idea di cosa sta succedendo.

+2

Attuazione che hanno sia 'Iterator <>' e 'Iterable <>' implementato ha effetto collaterale: http://blog.dreasgrech.com/2010/03/javas -iterators-and-iterables.html (sezione "Un Iterator non dovrebbe essere Iterable!"). Essere avvertito – Lu55

+0

In questo esempio, non vengono creati nuovi iteratori. Questo non funziona solo per una iterazione perché 'questo? Viene sempre restituito? – byxor

7

È necessario implementare l'Iterable interface, vale a dire, è necessario implementare il metodo

class MyClass implements Iterable<YourType> 
{ 
Iterator<YourType> iterator() 
    { 
    return ...;//an iterator over your data 
    } 
} 
7

versione corta del ciclo for (T stand per il mio tipo personalizzato):

for (T var : coll) { 
    //body of the loop 
} 

si traduce in:

for (Iterator<T> iter = coll.iterator(); iter.hasNext();) { 
    T var = iter.next(); 
    //body of the loop 
} 

e l'ho terator per la mia collezione potrebbe essere simile a questo:

class MyCollection<T> implements Iterable<T> { 

    public int size() { /*... */ } 

    public T get(int i) { /*... */ } 

    public Iterator<T> iterator() { 
     return new MyIterator(); 
    } 

    class MyIterator implements Iterator<T> { 

     private int index = 0; 

     public boolean hasNext() { 
      return index < size(); 
     } 

     public type next() { 
      return get(index++); 
     } 

     public void remove() { 
      throw new UnsupportedOperationException("not supported yet"); 

     } 
    } 
} 
Problemi correlati