2009-06-10 6 views
41

creo que la mayoría de los codificadores han utilizado un código como el siguiente:¿Cómo puedo usar Java para cada ciclo con clases personalizadas?


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

¿Cómo puedo aprovechar la para cada lazo con mis propias clases? ¿Hay una interfaz que debería implementar?

Respuesta

48

Puede implementar Iterable.

Aquí hay un example. No es lo mejor, ya que el objeto es su propio iterador. Sin embargo, debería darte una idea de lo que está pasando.

+2

Implementación que tienen tanto 'Iterator <>' y 'Iterable <>' implementado tiene efectos secundarios: http://blog.dreasgrech.com/2010/03/javas -iterators-and-iterables.html (sección "¡Un iterador no puede ser cortado!"). Ten cuidado. – Lu55

+0

En este ejemplo, no se están creando nuevos iteradores. ¿Esto no funciona solo para una iteración porque 'this' siempre se devuelve? – byxor

7

Hay que poner en práctica el Iterable interface, es decir, usted tiene que poner en práctica el método

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

La versión corta del de bucle (T stands para mi tipo de encargo):

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

se traduce en:

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

y el I terator para mi colección podría tener este aspecto:

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"); 

     } 
    } 
} 
Cuestiones relacionadas