2011-07-28 17 views

Respuesta

130

Una Iterable es una representación simple de una serie de elementos que pueden repetirse. No tiene ningún estado de iteración, como un "elemento actual". En cambio, tiene un método que produce un Iterator.

Un Iterator es el objeto con estado de iteración. Le permite verificar si tiene más elementos usando hasNext() y pasar al siguiente elemento (si corresponde) usando next().

Por lo general, un Iterable debe ser capaz de producir cualquier número de Iterator s válido.

+0

¿Importa eso si' Iterable' tiene iterador 'interal' o' external' o es posible tener alguno de ellos? – sakhunzai

8

Si una colección es iterable, se puede iterar utilizando un iterador (y consecuentemente se puede usar en a para cada ciclo). El iterador es el objeto real que iterará a través de la colección.

+2

FYI a java.util.Collection siempre implementa java.util.Iterable. –

+2

¿No es 'java.lang.Iterable'? – ulab

+0

Es 'java.lang.Iterable' – aldok

68

Una implementación de Iterable es uno que proporciona una Iterator de sí mismo:

public interface Iterable<T> 
{ 
    Iterator<T> iterator(); 
} 

Un iterador es una manera sencilla de permitir que algunos de bucle a través de una colección de datos sin privilegios de asignación (aunque con capacidad de eliminar) .

public interface Iterator<E> 
{ 
    boolean hasNext(); 
    E next(); 
    void remove(); 
} 

Ver Javadoc.

7

Implementación de la interfaz Iterable permite que un objeto sea el objetivo de la instrucción "foreach".

class SomeClass implements Iterable<String> {} 

class Main 
{ 
    public void method() 
    { 
    SomeClass someClass = new SomeClass(); 
    ..... 

    for(String s : someClass) { 
    //do something 
    } 
    } 
} 

Iterator es una interfaz que tiene una implementación para iterar sobre los elementos. Iterable es una interfaz que proporciona Iterator.

+1

Si alguna clase está implementando Iterable, debería tener un método Iterator() ¿correcto? Corrígeme si estoy equivocado. –

+0

sí. Debería tener el método no implementado de la interfaz. En este caso, es iterador. –

+0

Gracias por una respuesta inteligente. Vine aquí para verificar mi comprensión de Iterable vs Iterator. Lo confirmaste Todas las otras respuestas hablan sobre la estructura, lo que creo que está bien, pero no responde a la pregunta de POR QUÉ usaría una sobre la otra. – EricGreg

4

La consideración más importante es si el elemento en cuestión debe poder atravesar más de una vez. Esto se debe a que siempre puede rebobinar un Iterable al invocar iterator() nuevamente, pero no hay forma de rebobinar un Iterator.

12

Iterable: Una clase que se puede repetir. Es decir, uno que tiene la noción de "conseguirme lo primero, ahora lo siguiente, y así sucesivamente, hasta que se nos acabe".

iterador: Una clase que gestiona la iteración sobre un iterable. Es decir, realiza un seguimiento de dónde estamos en la iteración actual y sabe cuál es el siguiente elemento y cómo obtenerlo.

Para hacer un objeto iterable necesita emitir un objeto Iterator. Para hacer cumplir este contrato, se debe usar la interfaz Iterable. Contiene un método llamado iterator() y devuelve Iterator. Por lo tanto, cualquier clase que implemente Iterable devolverá un iterador.

public interface Collection<E> extends Iterable<E> {} 

Por ejemplo, tomar cualquier colección. Una Colección es una interfaz que representa contenedor para series de elementos. Todas las colecciones como ArrayList, Vector implementa Collection y así Iterator.

Una de las ventajas de Iterable es que, cuando implementa Iterable, el objeto obtiene soporte para: cada sintaxis de bucle.

+1

Supongo que 'Iterable' y' Iterator' son 'interface', no' clase'. – Ravi

0

Pregunta: ¿Diferencia entre Iterable y Iterador?
Respuesta:

iterable: Se relaciona con el bucle foreach
iterador: Se está relacionado con la Colección

El elemento de destino del bucle forEach shouble ser iterable.
Podemos usar Iterator para obtener el objeto uno por uno de la colección

Iterable presente en el paquete java.lang
iterador presente en el paquete java.util

Contiene sólo un método iterador()
Contiene tres método hasNext(), next(), eliminar()

Introducido en 1,5 versión
introducido en la versión 1.2

0

Además de ColinD y Seeker respuestas.

En términos simples, Iterable y iterador son ambas interfaces proporcionadas en el marco de recopilación de Java.

Iterable

Una clase tiene que implementar la interfaz Iterable si se quiere tener una para cada-bucle para iterar sobre su colección. Sin embargo, el bucle for-each solo se puede usar para recorrer la colección en la dirección de avance y no podrá modificar los elementos de esta colección. Pero, si todo lo que quiere es leer los datos de los elementos, entonces es muy simple y gracias a la expresión lambda de Java a menudo es un trazador de líneas. Por ejemplo:

iterableElements.forEach (x -> System.out.println(x)); 

iterador

Esta interfaz le permite iterar sobre una colección, la obtención y la eliminación de sus elementos. Cada una de las clases de recopilación proporciona un iterador() método que devuelve un iterador al comienzo de la colección. La ventaja de esta interfaz sobre iterable es que con esta interfaz puede agregar, modificar o eliminar elementos en una colección. Pero, acceder a los elementos necesita un poco más de código que iterable.Por ejemplo:

for (Iterator i = c.iterator(); i.hasNext();) { 
     Element e = i.next(); //Get the element 
     System.out.println(e); //access or modify the element 
} 

Fuentes:

  1. Java Doc Iterable
  2. Java Doc Iterator
0

hablando Básicamente, ambos están muy estrechamente relacionados entre sí.

Considere iterador a ser una interfaz que nos ayuda a atravesar a través de una colección con la ayuda de algunos métodos no definidos como hasNext(), next() y remove()

Por otro lado, Iterable es otra interfaz que, si es implementada por una clase, fuerza a la clase a ser Iterable y es un objetivo para construcciones For-Each. Tiene solo un método llamado iterator() que proviene de la propia interfaz de Iterator.

Cuando una colección es iterable, se puede iterar utilizando un iterador.

Para comprender visitar estos:

Iterable:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Iterable.java

ITERATORhttp://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Iterator.java

1

Consideremos un ejemplo que tiene 10 manzanas. Cuando implementa Iterable, es como poner cada manzana en cuadros de 1 a 10 y devolver un iterador que se puede usar para navegar.

Mediante la implementación de iterador, podemos conseguir cualquier manzana, manzana en próximos cajas etc.

Así ejecución iterables da un iterador para navegar sus elementos Aunque para navegar, es necesario implementar iterador ..

0

Como explicó here, se introdujo el "Iterable" para poder usar en el lazo foreach. Se puede repetir una clase implementando la interfaz Iterable.

iterador es la clase que gestiona la iteración sobre Iterable. Mantiene un estado de dónde estamos en la iteración actual, y sabe cuál es el siguiente elemento y cómo obtenerlo.

2

voy a responder a la pregunta sobre todo acerca de ArrayList como un ejemplo con el fin de ayudar a entender mejor ..

  1. interfaz Iterable obliga a sus subclases para implementar el método abstracto 'iterador()'.
public interface Iterable { 
    ... 
    abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T. 
    ... 
} 
    interfaz Iterator
  1. obliga a sus subclases para implementar el método abstracto 'hasNext()' y 'next()'.
public interface Iterator { 
    ... 
    abstract boolean hasNext(); //Returns true if the iteration has more elements. 
    abstract E next();   //Returns the next element in the iteration. 
    ... 
} 
  1. ArrayList implementa Lista, Lista implementa Recogida y Collection implementa Iterable .. Es decir, se podía ver la relación como

    'Iterable < - Colección < - Lista < - ArrayList'

. Y Iterable, Collection y List solo declaran el método abstracto 'iterator()' y ArrayList solo lo implementa.

  1. Voy a mostrar el código fuente de ArrayList con el método 'iterator()' de la siguiente manera para obtener información más detallada.

'iterator()' método devuelve un objeto de la clase 'Itr' que implementa 'Iterator'.

public class ArrayList<E> ... implements List<E>, ... 
{ 
    ... 
    public Iterator<E> iterator() { 
       return new Itr(); 
    } 


    private class Itr implements Iterator<E> { 
      ... 

      public boolean hasNext() { 
       return cursor != size; 
      } 
      @SuppressWarnings("unchecked") 
      public E next() { 
       checkForComodification(); 
       int i = cursor; 
       if (i >= size) 
        throw new NoSuchElementException(); 
       Object[] elementData = ArrayList.this.elementData; 
       if (i >= elementData.length) 
        throw new ConcurrentModificationException(); 
       cursor = i + 1; 
       return (E) elementData[lastRet = i]; 
      } 
      ... 
    } 
} 
  1. Algunos otros métodos o clases se iterar elementos de colecciones como ArrayList través de la utilización de Iterator (ITR).

Aquí hay un ejemplo simple.

public static void main(String[] args) { 

    List<String> list = new ArrayList<>(); 
    list.add("a"); 
    list.add("b"); 
    list.add("c"); 
    list.add("d"); 
    list.add("e"); 
    list.add("f"); 

    Iterator<String> iterator = list.iterator(); 
    while (iterator.hasNext()) { 
     String string = iterator.next(); 
     System.out.println(string); 
    } 
} 

Ahora, es claro? :)

+0

¡Sí! ¡Muy claro! –

Cuestiones relacionadas