Un portátil con una bombilla y diversos engranajes alrededor.

ListaArray: potenciamos los arrays practicando con clases 🚀

Guía de programación en Java > ListaArray

En esta sesión aprenderás a programar tu propia clase ListaArray, una versión simplificada de la clase ArrayList de Java. Este ejercicio no solo te ayudará a entender cómo funcionan los arrays de una dimensión, sino que también te permitirá practicar conceptos clave como encapsulación, métodos y gestión dinámica de datos.


¿Por qué no usar solo Arrays?

Aunque los arrays son una estructura básica y muy útil en Java, presentan varias limitaciones que pueden dificultar su uso en proyectos más complejos:

Limitaciones de los Arrays:

  1. Tamaño Fijo:
    • Cuando declaras un array, debes especificar su tamaño, y este no puede cambiar durante la ejecución del programa.
    • Esto es problemático si no sabes cuántos elementos necesitarás almacenar.
    Ejemplo: int[] numeros = new int[5]; numeros[5] = 10; // Error: Índice fuera de rango
  2. Gestión Manual de Espacio:
    • Si el array se llena, debes crear uno nuevo con más espacio y copiar los elementos existentes manualmente.
  3. Falta de Métodos Incorporados:
    • Los arrays no tienen métodos útiles como agregar, eliminar o buscar elementos. Todo esto debe programarse manualmente.
  4. No Verifican Tamaño Automáticamente:
    • Si intentas acceder a un índice fuera de los límites del array, obtendrás un error de tiempo de ejecución.
    Ejemplo: System.out.println(numeros[10]); // Error: ArrayIndexOutOfBoundsException

Por estas razones, Java ofrece la clase ArrayList, que es más flexible y fácil de usar. Sin embargo, hoy vamos a crear nuestra propia versión básica: MiArrayLista.


¿Qué Vamos a Construir? La Clase ListaArray

Objetivos:

  1. Crear una clase ArrayLista que use un array interno para almacenar elementos.
  2. Implementar métodos básicos:
    • add(elemento): Agregar un elemento al final.
    • get(indice): Obtener un elemento por su índice.
    • size(): Obtener el número de elementos almacenados.
    • remove(indice): Eliminar un elemento por su índice.
  3. Manejar el crecimiento dinámico del array.

1: Declarar la Clase y Atributos

Necesitamos un array interno para almacenar los datos y un contador para rastrear cuántos elementos hay.

Código:

public class ListaArray {
    private int[] elementos; // Array interno
    private int size;        // Número de elementos actuales

    // Constructor por defecto
    public ListaArray() {
        elementos = new int[10]; // Capacidad inicial
        size = 0;  // Ten en cuenta que ahora mismo no hay nada en la lista
    }
}


2: Método add

Este método agrega un elemento al final del array. Si el array está lleno, debemos crear uno nuevo con más capacidad.

Código:

public void add(int elemento) {
    if (size == elementos.length) {
        expandirCapacidad(); // Crear un array más grande si es necesario
    }
    elementos[size] = elemento; // Agregar el elemento
    size++;
}

// Método privado para expandir la capacidad del array
private void expandirCapacidad() {
    int[] nuevoArray = new int[elementos.length * 2]; // Duplicar tamaño
    for (int i = 0; i < elementos.length; i++) {
        nuevoArray[i] = elementos[i];
    }
    elementos = nuevoArray; // Reemplazar el array antiguo
}


3: Método get

Devuelve el elemento en un índice específico. Si el índice está fuera de rango, lanzamos una excepción.

Código:

public int get(int indice) {
    if (indice < 0 || indice >= size) {
        throw new IndexOutOfBoundsException("Índice fuera de rango");
    }
    return elementos[indice];
}


4: Método size

Devuelve el número de elementos almacenados.

Código:

public int size() {
    return size;
}


5: Método remove

Elimina un elemento en un índice específico y ajusta los elementos restantes.

Código:

public void remove(int indice) {
    if (indice < 0 || indice >= size) {
        throw new IndexOutOfBoundsException("Índice fuera de rango");
    }
    for (int i = indice; i < size - 1; i++) {
        elementos[i] = elementos[i + 1];
    }
    size--; // Reducir el tamaño
}


Clase Completa: ListaArray

Aquí tienes la implementación completa:

public class ListaArray {
    private int[] elementos;
    private int size;

    public ListaArray() {
        elementos = new int[10];
        size = 0;
    }

    public void add(int elemento) {
        if (size == elementos.length) {
            expandirCapacidad();
        }
        elementos[size] = elemento;
        size++;
    }

    private void expandirCapacidad() {
        int[] nuevoArray = new int[elementos.length * 2];
        for (int i = 0; i < elementos.length; i++) {
            nuevoArray[i] = elementos[i];
        }
        elementos = nuevoArray;
    }

    public int get(int indice) {
        if (indice < 0 || indice >= size) {
            throw new IndexOutOfBoundsException("Índice fuera de rango");
        }
        return elementos[indice];
    }

    public int size() {
        return size;
    }

    public void remove(int indice) {
        if (indice < 0 || indice >= size) {
            throw new IndexOutOfBoundsException("Índice fuera de rango");
        }
        for (int i = indice; i < size - 1; i++) {
            elementos[i] = elementos[i + 1];
        }
        size--;
    }
}


Ejemplo de Uso en la Clase Main

Código:

public class Main {
    public static void main(String[] args) {
        ListaArray lista = new ListaArray();

        lista.add(10);
        lista.add(20);
        lista.add(30);

        System.out.println("Elemento en el índice 1: " + lista.get(1));
        System.out.println("Tamaño: " + lista.size());

        lista.remove(1);
        System.out.println("Tamaño después de eliminar: " + lista.size());
    }
}

Salida:

Elemento en el índice 1: 20
Tamaño: 3
Tamaño después de eliminar: 2


Conclusión

Crear tu propia versión básica de ArrayList es una excelente forma de comprender cómo funcionan las estructuras dinámicas en Java. Has aprendido a superar las limitaciones de los arrays implementando:

  • Crecimiento dinámico.
  • Métodos para agregar, obtener y eliminar elementos.

Este conocimiento te será útil para entender estructuras de datos más avanzadas y apreciar las ventajas de usar clases como ArrayList en tus proyectos. ¡Ahora es tu turno de practicar y experimentar con mejoras en tu clase ListaArray! 🚀


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.