Arreglos

Arreglos dinámicos: ArrayList

Explora los arreglos dinámicos con ArrayList en Java, una estructura de datos que permite almacenar elementos de manera flexible. Aprende a crear, modificar y gestionar tus listas de datos con esta poderosa herramienta.

¿Qué es un arreglo dinámico?

Un arreglo dinámico es una estructura de datos que permite almacenar elementos de manera flexible, sin necesidad de definir un tamaño fijo al momento de su creación. A diferencia de los arreglos tradicionales, los arreglos dinámicos pueden crecer o reducirse según sea necesario, lo que los hace ideales para situaciones donde el número de elementos no se conoce de antemano.

ArrayList en Java

En Java, la clase ArrayList es una implementación de un arreglo dinámico que forma parte del paquete java.util. Esta clase proporciona métodos para agregar, eliminar y acceder a los elementos de la lista de manera eficiente.

Creación de un ArrayList

Para crear un ArrayList, puedes usar la siguiente sintaxis:

import java.util.ArrayList;

public class Main {
    void main() {
        ArrayList<String> lista = new ArrayList<>();
    }
}

Como puedes notar, se utiliza la sintaxis de genéricos <String> para especificar el tipo de elementos que se almacenarán en la lista. En este caso, estamos creando un ArrayList de cadenas de texto. Por lo que puedes almacenar cualquier tipo de dato, como números enteros, objetos personalizados, etc.

Agregar elementos a un ArrayList

Para agregar elementos a un ArrayList, puedes usar el método add():

lista.add("Hola");
lista.add("Mundo");

Sin embargo tambien contamos con la función addAll() para agregar varios elementos a la vez:

ArrayList<String> otraLista = new ArrayList<>();
otraLista.add("¡Bienvenido!");
otraLista.add("a Java");
lista.addAll(otraLista);

Y para agregar un elemento en una posición específica:

lista.add(1, "¡Hola de nuevo!");

Esto logra que el elemento "¡Hola de nuevo!", se inserte en la posición 1, desplazando los elementos posteriores hacia la derecha, si es necesario.

Recuerda que los índices en un ArrayList comienzan en 0, por lo que el primer elemento se encuentra en la posición 0, el segundo en la posición 1, y así sucesivamente. Por lo que al agregar un elemento en la posición 1, el elemento "¡Hola de nuevo!", se insertará entre "Hola" y "Mundo". Ten en cuenta que si intentas agregar un elemento en una posición que no existe (por ejemplo, un índice mayor que el tamaño actual de la lista), se lanzará una excepción IndexOutOfBoundsException. Asegúrate de verificar el tamaño de la lista antes de agregar elementos en posiciones específicas para evitar errores.

Acceder a elementos de un ArrayList

Para acceder a los elementos de un ArrayList, puedes usar el método get():

String primerElemento = lista.get(0); // "Hola"
String segundoElemento = lista.get(1); // "¡Hola de nuevo!"

Modificar elementos de un ArrayList

Para modificar un elemento en un ArrayList, puedes usar el método set():

lista.set(1, "¡Hola a todos!"); // Modifica el elemento en la posición 1
Recuerda que el método set() reemplaza el elemento en la posición especificada con el nuevo valor. Asegúrate de que el índice que estás modificando esté dentro del rango válido (entre 0 y el tamaño de la lista menos uno) para evitar una excepción IndexOutOfBoundsException. Si intentas modificar un elemento en una posición que no existe, se lanzará una excepción, así que siempre verifica el tamaño de la lista antes de realizar modificaciones.

Eliminar elementos de un ArrayList

Para eliminar elementos de un ArrayList, puedes usar el método remove():

lista.remove(1); // Elimina el elemento en la posición 1

También puedes eliminar un elemento por su valor:

lista.remove("Mundo"); // Elimina el primer elemento que coincida con "Mundo"

Tamaño de un ArrayList

Para obtener el tamaño de un ArrayList, puedes usar el método size():

int tamaño = lista.size(); // Devuelve el número de elementos en la lista

Iterar sobre un ArrayList

Puedes iterar sobre los elementos de un ArrayList utilizando un bucle for o un bucle for-each:

// Usando un bucle for
for (int i = 0; i < lista.size(); i++) {
    System.out.println(lista.get(i));
}

// Usando un bucle for-each
for (String elemento : lista) {
    System.out.println(elemento);
}

Usando comparadores con ArrayList

Para ordenar un ArrayList de objetos personalizados, puedes usar la interfaz Comparator. Primero, debes crear una clase que implemente Comparator y luego usar el método sort() de Collections para ordenar la lista.

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class Persona {
    String nombre;
    int edad;

    Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }
}

class ComparadorPorEdad implements Comparator<Persona> {
    @Override
    public int compare(Persona p1, Persona p2) {
        return Integer.compare(p1.edad, p2.edad);
    }
}
public class Main {
    void main() {
        ArrayList<Persona> personas = new ArrayList<>();
        personas.add(new Persona("Alice", 30));
        personas.add(new Persona("Bob", 25));
        personas.add(new Persona("Charlie", 35));

        Collections.sort(personas, new ComparadorPorEdad());
        for (Persona persona : personas) {
            System.out.println(persona.nombre + " (" + persona.edad + " años)");
        }
    }
}

En este ejemplo, hemos creado una clase Persona con atributos nombre y edad. Luego, hemos implementado un comparador ComparadorPorEdad que compara dos objetos Persona por su edad. Finalmente, hemos ordenado la lista de personas utilizando el método sort() de Collections y el comparador que hemos creado.

Recuerda que de igual forma puedes usar el orden natural de los objetos si implementas la interfaz Comparable en la clase Persona, lo que te permitirá ordenar la lista sin necesidad de un comparador externo, de la siguiente manera:

class Persona implements Comparable<Persona> {
    String nombre;
    int edad;

    Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }

    @Override
    public int compareTo(Persona otra) {
        return Integer.compare(this.edad, otra.edad);
    }
}

En este caso, la clase Persona implementa la interfaz Comparable y define el método compareTo() para comparar dos objetos Persona por su edad. Esto permite ordenar la lista de personas utilizando el orden natural definido por el método compareTo(), sin necesidad de un comparador externo de la siguiente manera:

public class Main {
    void main() {
        ArrayList<Persona> personas = new ArrayList<>();
        personas.add(new Persona("Alice", 30));
        personas.add(new Persona("Bob", 25));
        personas.add(new Persona("Charlie", 35));

        Collections.sort(personas);
        for (Persona persona : personas) {
            System.out.println(persona.nombre + " (" + persona.edad + " años)");
        }
    }
}

Conclusión

El ArrayList es una estructura de datos muy útil en Java para almacenar y gestionar colecciones de elementos de manera flexible. Permite agregar, eliminar, modificar y acceder a los elementos de la lista de forma eficiente. Además, con el uso de comparadores o implementando la interfaz Comparable, puedes ordenar tus listas de objetos personalizados según tus necesidades. Es importante recordar que el ArrayList es parte del paquete java.util, por lo que debes importarlo para poder utilizarlo en tu código.

Copyright Jesús Aurelio Castro Magaña © 2026