Iteradores#

Patrón Iterador#

Cada colección es Iterable. Puede obtener su objeto Iterator para recorrer todos los elementos de la colección.

El patrón iterador permite recorrer una colección de elementos sin exponer su representación interna. Proporciona una manera de acceder secuencialmente a los elementos de una colección.

Clases en el Patrón Iterador#

  1. Iterador: Define una interfaz para acceder y recorrer los elementos de una colección.

  2. Agregado: Define una interfaz para crear un iterador asociado a su colección.

Implementaciones Concretas#

  1. Iterador-Concreto: Implementa la interfaz Iterador para recorrer una colección específica.

  2. Agregado-Concreto: Implementa la interfaz Agregado y devuelve una instancia de su iterador asociado.

Ejemplo de un iterador y agregado en Java:

import java.util.ArrayList;
import java.util.Iterator;

class ColeccionNumeros implements Iterable<Integer> {
    private ArrayList<Integer> numeros = new ArrayList<>();

    public void agregarNumero(int numero) {
        numeros.add(numero);
    }

    @Override
    public Iterator<Integer> iterator() {
        return numeros.iterator();
    }
}

public class Main {
    public static void main(String[] args) {
        ColeccionNumeros coleccion = new ColeccionNumeros();
        coleccion.agregarNumero(1);
        coleccion.agregarNumero(2);
        coleccion.agregarNumero(3);

        for (int numero : coleccion) {
            System.out.println(numero);
        }
    }
}

En este ejemplo, ColeccionNumeros implementa la interfaz Iterable, lo que permite que se pueda iterar usando un for-each.

// Probar los códigos aquí
../images/Figure20.2.png

Figura 7 Here is my figure caption!#

import java.util.*;
public class TestIterator {
  public static void main(String[] args) {
  Collection<String> collection = new ArrayList<>();
  collection.add("New York");
  collection.add("Atlanta");
  collection.add("Dallas");
  collection.add("Madison");
  Iterator<String> iterator = collection.iterator();
  while (iterator.hasNext()) {
    System.out.print(iterator.next().toUpperCase() + " ");
  }
  System.out.println();
  }
}
// Probar el código aquí

Iteraciones sobre Arreglos#

Las iteraciones sobre arreglos en Java pueden realizarse mediante estructuras de control como for, while, o bien usando los iteradores.

Ejemplo de iteración sobre un arreglo:

public class IteracionArreglos {
  public static void main(String[] args) {
      int[] numeros = {1, 2, 3, 4, 5};

      // Iteración usando un bucle for
      for (int i = 0; i < numeros.length; i++) {
          System.out.println("Número: " + numeros[i]);
      }

      // Iteración usando for-each
      for (int numero : numeros) {
          System.out.println("Número: " + numero);
      }
  }
}
// Probar los códigos aquí

Iteraciones sobre Matrices#

Las matrices o arreglos bidimensionales también pueden ser iterados utilizando bucles anidados.

Ejemplo de iteración sobre una matriz:

public class IteracionMatrices {
  public static void main(String[] args) {
      int[][] matriz = {
          {1, 2, 3},
          {4, 5, 6},
          {7, 8, 9}
      };

      // Iteración sobre una matriz
      for (int i = 0; i < matriz.length; i++) {
          for (int j = 0; j < matriz[i].length; j++) {
              System.out.println("Elemento en [" + i + "][" + j + "]: " + matriz[i][j]);
          }
      }
  }
}

En este código, la primera iteración recorre las filas de la matriz y la segunda recorre las columnas de cada fila.

// Probar los códigos aquí

Conclusión#

El uso de genéricos, interfaces e iteradores es fundamental en la programación orientada a objetos en Java, permitiendo crear soluciones más flexibles, reutilizables y mantenibles. El patrón iterador, en particular, facilita la navegación por colecciones sin exponer su implementación interna. Estas herramientas son esenciales para gestionar la complejidad en programas más grandes y modulares.

Recursos Adicionales#