2008-10-22 45 views

Respuesta

8

encontré este description:

externos frente a los iteradores internos.

Iteradores externos: cuando la iteración está controlada por el objeto de colección decimos que tenemos un iterador externo.

En idiomas como .net o Java, es muy fácil crear iteradores externos. En nuestra implementación clásica, se implementa un iterador externo. En el siguiente ejemplo se utiliza un repetidor externo:

// using iterators for a clloection of String objects: 
// using in a for loop 
for (Iterator it = options.iterator(); it.hasNext();) { 
    String name = (String)it.next(); 
    System.out.println(name); 
} 

// using in while loop 
Iterator name = options.iterator(); 
    while (name.hasNext()){ 
     System.out.println(name.next()); 
    } 

// using in a for-each loop (syntax available from java 1.5 and above) 
    for (Object item : options) 
     System.out.println(((String)item)); 

iteradores internos - Cuando el iterador controla tenemos un iterador interno

Por otro lado la implementación y uso de iteradores internos es realmente difícil. Cuando se usa un iterador interno, significa que el código que se ejecutará se delega al objeto agregado. Por ejemplo, en idiomas que ofrecen soporte para esto es fácil llamar a los iteradores internos:

collection do: [:each | each doSomething] (Smalltalk) 

La idea principal es pasar el código a ser ejecutado a la colección. Luego, la colección llamará internamente el método doSomething en cada uno de los componentes. En C++, es posible enviar el método doMethod como un puntero. En C#, .NET o VB.NET, es posible enviar el método como delegado. En java, se debe usar el patrón de diseño Functor. La idea principal es crear una interfaz base con solo un método (doSomething). Luego, el método se implementará en una clase que implemente la interfaz y la clase se pasará a la colección para iterar. Para obtener más detalles, consulte el patrón de diseño Functor.

17

iterador externo

Cuando se obtiene un iterador y pasar por encima de ella, que es un iterador externa

for (Iterator iter = var.iterator(); iter.hasNext();) { 
    Object obj = iter.next(); 
    // Operate on obj 
} 

interna iterador

Cuando se pasa un objeto de función a un método para ejecutar más de una lista, que es un iterador interno

var.each(new Functor() { 
    public void operate(Object arg) { 
    arg *= 2; 
    } 
}); 
+1

Dado que Java 5 es la forma preferida para usar un iterador externo, sería usar el bucle for-each: * for (Object o: var) {// NOOP} * aunque es meramente azúcar sintáctico para el iterador explícito que usa la versión. – Alex

+1

@JohannZacharee no se considera bucle foreach como un iterador interno, ya que no tenemos el control sobre el iterador? – denis631

+1

@ denis631 Sí, estoy de acuerdo en que el ciclo foreach actúa de forma similar a un iterador interno. No lo usé como mi ejemplo, ya que entiendo que Java los convierte a un iterador externo en el momento de la compilación. Elegí un ejemplo funcional para ilustrar más claramente las diferencias. –