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:
- 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.
 
int[] numeros = new int[5]; numeros[5] = 10; // Error: Índice fuera de rango - Gestión Manual de Espacio:
- Si el array se llena, debes crear uno nuevo con más espacio y copiar los elementos existentes manualmente.
 
 - Falta de Métodos Incorporados:
- Los arrays no tienen métodos útiles como agregar, eliminar o buscar elementos. Todo esto debe programarse manualmente.
 
 - 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.
 
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
ArrayObjetivos:
- Crear una clase 
ArrayListaque use un array interno para almacenar elementos. - 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.
 - 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