Cómo eliminar un elemento de un ArrayList en Java

Rate this post

La clase java.util.ArrayList forma parte de la Collections Framework y es una estructura de datos que permite almacenar elementos en un formato similar a un array, pero de manera dinámica. A diferencia de los arrays tradicionales, el tamaño de un ArrayList puede modificarse en tiempo de ejecución conforme se agregan o eliminan elementos. Esta característica del ArrayList facilitará tu tarea si estás trabajando en programas que hacen gran uso de la manipulación de listas. En este artículo explicamos tres formas de eliminar un elemento de un ArrayList en Java:

  • Eliminar un elemento por índice usando el método remove(int).
  • Eliminar un elemento por valor usando el método remove(Object).
  • Eliminar un elemento de forma condicional.

¿Cómo eliminar elemento de un ArrayList Java usando el índice?

Eliminar un elemento de un ArrayList usando su índice es una de las operaciones más comunes en Java. Este enfoque es útil cuando conoces la posición exacta del elemento dentro de la lista. Para esto, se utiliza el método remove(int index), que elimina el elemento en la posición indicada por el índice.

¿Cómo funciona remove(int index)?

El método remove(int index) toma un parámetro que es el índice del elemento que deseas eliminar. El índice se basa en cero, lo que significa que el primer elemento tiene el índice 0, el segundo tiene el índice 1, y así sucesivamente.

Ejemplo de código para eliminar un elemento por su índice:

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        // Crear un ArrayList con elementos
        ArrayList<String> lista = new ArrayList<>();
        lista.add("Manzana");
        lista.add("Plátano");
        lista.add("Cereza");
        lista.add("Pera");

        // Eliminar el elemento en el índice 2 (Cereza)
        lista.remove(2);

        // Mostrar el contenido de la lista después de la eliminación
        System.out.println(lista);  // Salida: [Manzana, Plátano, Pera]
    }
}

En este ejemplo, el elemento en el índice 2, «Cereza», es eliminado de la lista. Tras la operación, el ArrayList contiene solo los elementos «Manzana», «Plátano» y «Pera».

Consideraciones:

Índices fuera de rango: Si intentas eliminar un elemento con un índice que no existe en la lista, Java lanzará una excepción IndexOutOfBoundsException. Por lo tanto, es importante asegurarse de que el índice esté dentro del rango de la lista.

// Intento de eliminar un índice que no existe
lista.remove(10);  // Lanzará IndexOutOfBoundsException si la lista tiene menos de 11 elementos.

¿Cómo eliminar elemento de un ArrayList Java por valor?

En Java, además de eliminar un elemento de un ArrayList usando su índice, también es común eliminar elementos por valor. Para hacer esto, se utiliza el método remove(Object o), que elimina la primera aparición del objeto que coincida con el valor proporcionado.

¿Cómo funciona remove(Object o)?

El método remove(Object o) toma como argumento un objeto y lo elimina de la lista si se encuentra una coincidencia exacta. Si el ArrayList contiene más de una instancia del mismo valor, solo se eliminará la primera que se encuentre. Si el valor no existe en la lista, el ArrayList permanece sin cambios y el método devuelve false.

Ejemplo de código para eliminar un valor específico:

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        // Crear un ArrayList con elementos
        ArrayList<String> lista = new ArrayList<>();
        lista.add("Manzana");
        lista.add("Plátano");
        lista.add("Cereza");
        lista.add("Plátano");

        // Eliminar el valor "Plátano" de la lista
        lista.remove("Plátano");

        // Mostrar el contenido de la lista después de la eliminación
        System.out.println(lista);  // Salida: [Manzana, Cereza, Plátano]
    }
}

En este ejemplo, el valor "Plátano" es eliminado de la lista. Como hay dos elementos con el valor «Plátano», solo se elimina la primera aparición. La lista resultante contiene "Manzana", "Cereza" y el último "Plátano".

Consideraciones sobre la búsqueda de elementos:

  • Coincidencia exacta: El método remove(Object o) usa el método equals() del objeto para determinar si un elemento de la lista coincide con el valor que proporcionas. Por lo tanto, es importante que los objetos sean comparables de manera adecuada. Por ejemplo, si trabajas con objetos personalizados, asegúrate de sobrescribir el método equals() en la clase del objeto si necesitas una comparación precisa.
  • Elementos duplicados: Si el valor a eliminar aparece varias veces en el ArrayList, remove(Object o) eliminará solo la primera instancia. Si necesitas eliminar todas las ocurrencias de un valor, puedes usar un bucle o un método como removeIf() para hacerlo de manera eficiente.
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        // Crear un ArrayList con elementos
        ArrayList<String> lista = new ArrayList<>();
        lista.add("Manzana");
        lista.add("Plátano");
        lista.add("Cereza");
        lista.add("Plátano");

        // Eliminar todas las apariciones de "Plátano"
        lista.removeIf(item -> item.equals("Plátano"));

        // Mostrar el contenido de la lista después de la eliminación
        System.out.println(lista);  // Salida: [Manzana, Cereza]
    }
}

¿Cómo eliminar elemento de un ArrayList Java que cumple una condición específica?

Existen varias formas de eliminar un elemento de un ArrayList en Java en base a una condición. Primero vamos a ver qué sucede si lo hacemos mientras iteramos la lista usando un bucle for. Para esto vamos a crear una lista de Strings y, a fines ilustrativos, vamos a intentar eliminar los elementos cuya longitud sea mayor de tres caracteres:

import java.util.*;

public class Main {
    public static void main(String[] args) {
      
      List<String> animals = new ArrayList<>(Arrays.asList("Dog", "Cat", "Bird"));
      
      for (String animal : animals){
        if (animal.length() > 3){
          animals.remove(animal);
        }
      }
   }
}

En el ejemplo anterior, usamos un bucle for de Java para recorrer una colección y luego evaluar cada elemento para ver si cumple con nuestros criterios. Si es así, intentamos eliminar ese elemento. Sin embargo, al hacerlo, nos encontraremos con una ConcurrentModificationException:

Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1095)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:1049)
at Main.main(Main.java:8)

Esto ocurre porque el ArrayList detecta que su estructura ha sido modificada mientras se estaba recorriendo con un iterador implícito del bucle, lo cual viola las reglas de concurrencia de Java.

Lo que vamos a hacer es ver un par de formas diferentes de resolver esto. Una de ellas es la forma tradicional y la otra es un método más nuevo que se agregó a Java 8 en la interfaz Collection.

Solución 1 (tradicional)

Una forma de resolver esto es recurrir a la vieja escuela, el método utilizado antes de Java 8. Podemos crear el iterador de manera explícita y recorrerlo directamente. Así, crearemos un iterador y lo recorreremos dentro de un bucle while. Luego, verificaremos si el elemento cumple con nuestro criterio de longitud y, si no es así, utilizaremos el iterador para eliminarlo mediante el método remove():

import java.util.*;

public class Main {
    public static void main(String[] args) {
      List<String> animals = new ArrayList<>(Arrays.asList("Dog", "Cat", "Bird"));

      Iterator<String> iterator = animals.iterator();
      String animal = null;

      while(iterator.hasNext()){
        animal = iterator.next();

        if (animal.length() > 3){
          iterator.remove();
        }
      }
      
      System.out.println(animals);
  }
}

OUTPUT:

[Dog, Cat]

Solución 2 (Java 8)

La solución vista anteriormente, aunque efectiva, es una forma arcaica y verbosa de hacerlo. Afortunadamente, Java 8 introdujo un nuevo método en la interfaz Collection llamado removeIf. Este método toma un predicado, lo que nos permite eliminar elementos en función de alguna condición.

¿Cómo funciona removeIf()?

El método removeIf() toma un predicado como argumento. Un predicado es una expresión que evalúa una condición sobre cada elemento del ArrayList. Si el elemento cumple con esa condición, será eliminado de la lista. Es una forma de realizar eliminaciones de manera más flexible que basarse solo en índices o valores exactos.

Ejemplo 1: Eliminar elementos mayores que 10:

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        // Crear un ArrayList con elementos
        ArrayList<Integer> lista = new ArrayList<>();
        lista.add(5);
        lista.add(12);
        lista.add(8);
        lista.add(15);
        lista.add(3);

        // Eliminar todos los elementos mayores que 10
        lista.removeIf(n -> n > 10);

        // Mostrar el contenido de la lista después de la eliminación
        System.out.println(lista);  // Salida: [5, 8, 3]
    }
}

En este ejemplo, la expresión lambda n -> n > 10 se utiliza como predicado para eliminar todos los elementos que sean mayores que 10. Después de la ejecución, los elementos 12 y 15 son eliminados de la lista.

Ejemplo 2: Eliminar cadenas que no contienen una subcadena específica:

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        // Crear un ArrayList con cadenas
        ArrayList<String> lista = new ArrayList<>();
        lista.add("manzana");
        lista.add("plátano");
        lista.add("cereza");
        lista.add("pera");

        // Eliminar todas las cadenas que no contienen la letra 'z'
        lista.removeIf(s -> !s.contains("z"));

        // Mostrar el contenido de la lista después de la eliminación
        System.out.println(lista);  // Salida: [manzana, cereza]
    }
}

Conclusión

En este artículo hemos visto diferentes formas de eliminar un elemento de un ArrayList en Java. Comenzamos con los métodos básicos como remove(int) para eliminar por índice y remove(Object) para eliminar por valor. Luego, abordamos situaciones más complejas, como la eliminación condicional, donde presentamos soluciones clásicas utilizando un iterador explícito y la alternativa moderna con el método removeIf() introducido en Java 8.

Si necesitas más detalles sobre el manejo de colecciones en Java, te recomendamos explorar más sobre los iteradores, el uso de otras colecciones como HashSet o LinkedList, y cómo aprovechar las características avanzadas del lenguaje, como Streams y Lambdas. Para profundizar, revisa nuestros otros artículos relacionados y tutoriales prácticos sobre el tema.

Referencias