Hay dos formas de eliminar objetos de ArrayList en Java, primero, mediante el método remove (), y segundo mediante el Iterador. ArrayList proporciona sobrecargado método remove (), aceptar índice del objeto a eliminar es decir, remove(int index), y otros aceptan objeto a eliminar, es decir, remove(Object obj). La regla general es que, si conoce el índice del objeto, use el primer método, de lo contrario, use el segundo método. Por cierto, debe recordar usar métodos de eliminación de ArrayList, solo cuando no esté iterando sobre ArrayList si está iterando, use Iterador.método remove (), si no lo hace, puede resultar en SimultaneoModificationException en Java. Otro gotcha puede haber ocurrido debido a la autoboxing. Si observa de cerca que dos métodos de eliminación, remove (int index) y remove(Object obj) son indistinguibles si está tratando de eliminar de una lista de enteros de ArrayList.Supongamos que tiene tres objetos en ArrayList, es decir, y desea eliminar el segundo objeto, que es 2. Puede llamar a remove(2), que en realidad es una llamada a remove(Objeto) si considera la posibilidad de realizar una caja automática, pero se interpretará como una llamada a remove 3rd element, interpretando como remove(índice).He discutido este problema anteriormente en mi artículo sobre las mejores prácticas a seguir al sobrecargar métodos en Java. Debido a la regla de ampliación y la caja automática menos conocidas, el método mal sobrecargado puede crear mucha ambigüedad.
Ejemplo de código Para Eliminar elementos de ArrayList
Probemos la teoría anterior con un ejemplo de código simple de ArrayList con Enteros. El siguiente programa tiene una lista de enteros que contienen 1, 2 y 3, es decir, esto corresponde exactamente al índice.
prueba de paquetes; importa java.útil.ArrayList;import java.útil.Lista;/** * * @author http://java67.blogspot.com */public class JavaTutorial{ /** * @param args los argumentos de línea de comandos */ public static void main(String args) { List<Integer> numeros = new ArrayList<Integer>(); números.añadir (1); números.añadir (2); números.add (3); Sistema.fuera.println ("ArrayList contiene:" + números); / / Llamando a números de eliminación(índice).remove (1); //eliminar objeto en el índice 1, es decir, el 2do objeto, que es 2 / / Llamar a números remove(objeto).remove (3);}} Salida:ArrayList contiene : Excepción en el subproceso java "principal".lang.IndexOutOfBoundsException: Índice: 3, Tamaño: 2 en java.útil.ArrayList.rangeCheck (ArrayList.java:635) en java.útil.ArrayList.eliminar (ArrayList.java:474) en la prueba.Prueba.principal (Prueba.java: 33) Resultado de Java: 1
Puede ver que la segunda llamada también se trata como remove (índice). La mejor manera de eliminar la ambigüedad es sacar la caja automática y proporcionar un objeto real, como se muestra a continuación.
Sistema.fuera.println ("ArrayList Before:" + numbers); / / Llamando a números de eliminación (índice).remove (1); //eliminar objeto en el índice 1, es decir, el 2do objeto, que es 2 / / Llamar a números remove(objeto).remove(nuevo entero (3));Sistema.fuera.println ("ArrayList After:" + numbers);Output :ArrayList Before : ArrayList After :
Esta vez funciona, pero tengo miedo de desarrolladores perezosos como yo, lo que da lugar a la autoboxing. Ahora echemos un vistazo a la eliminación del objeto de ArrayList mientras se itera sobre ellos. Debe estar familiarizado con el Iterador en Java, antes de continuar.
Remove Object From ArrayList using Iterator
Este es en realidad un detalle sutil de la programación Java, no obvio para los principiantes, ya que el compilador no se quejará, incluso si usa el método remove() de java.útil.ArrayList, mientras se usa el iterador. Solo te darás cuenta de tu error, cuando veas ConcurrentModificationException, que en sí mismo es engañoso y puedes pasar incontables horas encontrando otro hilo, que está modificando ese ArrayList, debido a la palabra Concurrente. Veamos un ejemplo.
public static void main(String args) { List<Integer> numeros = new ArrayList<Integer>(); números.suma (101); números.suma (200); números.suma (301); números.add(400); Sistema.fuera.println ("ArrayList Before:" + números); Iterator<Integer> itr = numbers.iterator(); // remove all even numbers while (itr.hasNext()) { Integer number = itr.next(); if (number % 2 == 0) { numbers.remove(number); } } System.out.println("ArrayList After : " + numbers); }Output :ArrayList Before : Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859) at java.util.ArrayList$Itr.next(ArrayList.java:831) at Testing.main(Testing.java:28)
Puede simultanearmodificationexception, debido a la llamada al método remove() de ArrayList. Esto es fácil en ejemplos simples como este, pero en un proyecto real, puede ser muy difícil. Ahora, para solucionar esta excepción, simplemente reemplace la llamada de números.remove () a itr.remove(), eliminará el objeto actual que está iterando, como se muestra a continuación :
Sistema.fuera.println ("ArrayList Before:" + numbers); Iterador<Entero> itr = numbers.iterator (); / / elimina todos los números pares mientras (itr.hasNext ()) {Número entero = itr.siguiente(); if (número % 2 == 0) { itr.remove(); }}Sistema.fuera.println ("ArrayList After:" + numbers); OutputArrayList Before : ArrayList After :
Eso es todo en este post sobre Cómo eliminar objetos de ArrayList en Java. Hemos aprendido dos maneras de eliminar un objeto o elemento de ArrayList. Por cierto, siempre debe usar remove (index) para eliminar objetos, si no está iterando, de lo contrario, siempre use el método remove () del Iterador para eliminar objetos de ArrayList. Por cierto, los consejos anteriores funcionarán con cualquier implementación de lista basada en índices.
Aprendizaje adicional
Java En Profundidad: Conviértase en un Ingeniero Java Completo
Fundamentos de Java: Colecciones
Estructuras de datos y Algoritmos: Inmersión Profunda Utilizando Algoritmos y Estructuras de Datos de Java-Parte 1 y 2
Estructuras de datos en Java 9 por Heinz Kabutz