Foros del Web » Programación para mayores de 30 ;) » Java »

Problema eliminando elemento de un ArrayList

Estas en el tema de Problema eliminando elemento de un ArrayList en el foro de Java en Foros del Web. Bien el caso es el siguiente: Tengo un declarado: private ArrayList <Coche> listadoCoches = new ArrayList(); Y este método que elimina un coche del ArrayList ...
  #1 (permalink)  
Antiguo 15/01/2008, 14:41
 
Fecha de Ingreso: enero-2008
Mensajes: 10
Antigüedad: 16 años, 3 meses
Puntos: 1
Pregunta Problema eliminando elemento de un ArrayList

Bien el caso es el siguiente:

Tengo un declarado: private ArrayList <Coche> listadoCoches = new ArrayList();

Y este método que elimina un coche del ArrayList siempre que coincida la matricula

Código:
23       public void sacaCoche(String matricula)
24	{
25		Coche cocheABorrar = null;
26
27		for(Coche coche:listadoCoches)
28		{
29			if(coche.getMatricula().equalsIgnoreCase(matricula))
30			{
31				cocheABorrar = coche;
32				break;
33			}
34		}
35		if( cocheABorrar == null )
36			System.out.println("Coche no encontrado");
37		else this.listadoCoches.remove(cocheABorrar);		
38	}
Cuando lo ejecuto pasandole una matrícula existente en el Arraylist me devuelve esto:

Código:
Exception in thread "main" java.util.ConcurrentModificationException
        at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
        at java.util.AbstractList$Itr.next(AbstractList.java:343)
        at boletin2.ejercicio7.Concesionario.sacaCoche(Concesionario.java:26)
        at boletin2.ejercicio7.Prueba.main(Prueba.java:40)
Java Result: 1
Según entiendo tiene que ver con el Iterator implicito en el bucle pero no entiendo bien cuál es el problema.


Gracias
  #2 (permalink)  
Antiguo 15/01/2008, 16:28
 
Fecha de Ingreso: enero-2008
Mensajes: 10
Antigüedad: 16 años, 3 meses
Puntos: 1
Re: Problema eliminando elemento de un ArrayList

He cambiado el bucle por si podía ser problema del Iterator pero sigue lanzandome el mismo error:

Código:
  public void sacaCoche(String matricula)
	{
		Coche cocheABorrar = null;

		for( int i=0; i<this.listadoCoches.size(); i++)
		{
			Coche coche = this.listadoCoches.get(i);
			if(coche.getMatricula().equalsIgnoreCase(matricula))
			{
				cocheABorrar = coche;
				break;
			}
		}
		if( cocheABorrar == null )
			System.out.println("Coche no encontrado");
		else this.listadoCoches.remove(cocheABorrar);		
	}
Nadie ve dónde puede estar el error?
  #3 (permalink)  
Antiguo 16/01/2008, 01:48
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Problema eliminando elemento de un ArrayList

ConcurrentModificationException

No puedes borrar elementos de una coleccion mientras la estas recorriendo. Lo dice el API. Para borrarlo tienes que usar el metodo propio del Iterator que uses para recorrerlo. Así que lo habitual es recorrer el Iterator y cuando te encuentres el elemento a borrar, ejecutar miIterador.remove();

En el segundo caso que pones no se exactamente por que da el error a no ser que tengas un Iterador por ahi, si no te deberia dar otra excepción, pero como no esta el stacktrace no puedo detallar más.

S!
  #4 (permalink)  
Antiguo 17/01/2008, 11:24
 
Fecha de Ingreso: enero-2008
Mensajes: 16
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Problema eliminando elemento de un ArrayList

El problema lo tienes en la última línea, si te fijas el método "remove" tiene que recibir como parámetro un int y no un objecto. Vamos es lo que creo que está mal, ya nos dirás...
  #5 (permalink)  
Antiguo 17/01/2008, 11:47
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Problema eliminando elemento de un ArrayList

Cita:
Iniciado por josimapi Ver Mensaje
El problema lo tienes en la última línea, si te fijas el método "remove" tiene que recibir como parámetro un int y no un objecto. Vamos es lo que creo que está mal, ya nos dirás...
En realidad no. El metodo admite tanto hacerlo por indice como por elemento:
http://java.sun.com/j2se/1.5.0/docs/...va.lang.Object)

S!

PD De todas formas, si la llamada del metodo estuviera mal, el error sería de compilación o le daría un ClassCastException o similar, no el error que le esta dando.
  #6 (permalink)  
Antiguo 05/06/2009, 09:10
 
Fecha de Ingreso: junio-2009
Mensajes: 1
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Problema eliminando elemento de un ArrayList

Proba esto y contame =)

Código:
 public void sacaCoche(String matricula)
	{
		Coche cocheABorrar = null;
                Iterator itera = this.listadoCoches.iterator();

		while(itera.hasNext())
		{
			Coche coche = itera.next();
			if(coche.getMatricula().equalsIgnoreCase(matricula))
			{
				cocheABorrar = coche;
				break;
			}
		}
		if( cocheABorrar == null )
			System.out.println("Coche no encontrado");
		else this.listadoCoches.remove(cocheABorrar);		
	}

Última edición por javix3; 05/06/2009 a las 09:39
  #7 (permalink)  
Antiguo 22/02/2010, 06:41
 
Fecha de Ingreso: febrero-2010
Mensajes: 1
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Re: Problema eliminando elemento de un ArrayList

Cita:
Iniciado por tunombre Ver Mensaje
He cambiado el bucle por si podía ser problema del Iterator pero sigue lanzandome el mismo error:

Código:
  public void sacaCoche(String matricula)
	{
		Coche cocheABorrar = null;

		for( int i=0; i<this.listadoCoches.size(); i++)
		{
			Coche coche = this.listadoCoches.get(i);
			if(coche.getMatricula().equalsIgnoreCase(matricula))
			{
				cocheABorrar = coche;
				break;
			}
		}
		if( cocheABorrar == null )
			System.out.println("Coche no encontrado");
		else this.listadoCoches.remove(cocheABorrar);		
	}
Nadie ve dónde puede estar el error?
Tal vez el problema se de cuando llamas al método "sacaCoche(...)" desde varios lugares en forma concurrente. Ya que this.listadoCoches es una propiedad compartida, pueden haber múltiples threads (o request en una pág. web) accediendo, a través de "sacaCoche(...)" a este listado. De esta forma, cuando hay uno de esos threads (o request) recorriendo el listado para detectar qué coche sacar, puede haber otro thread haciendo el "remove" y ahí la cosa queda "indeterminable". Como precaución a esto, JVM arroja la "exception" que se indica.
Prueba usar bloques "synchronized", utilizando mapas o listas sincronizadas (ver java.util.Collections).
  #8 (permalink)  
Antiguo 22/02/2010, 07:16
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Problema eliminando elemento de un ArrayList

El mensaje es de enero de 2008. RIP.
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #9 (permalink)  
Antiguo 20/04/2010, 15:03
Avatar de xlugo2002  
Fecha de Ingreso: noviembre-2002
Ubicación: Puebla, México
Mensajes: 474
Antigüedad: 21 años, 5 meses
Puntos: 0
Respuesta: Problema eliminando elemento de un ArrayList

import java.util.ArrayList;
import java.util.Iterator;

public class Metodos {

private static ArrayList<String> modifica(ArrayList<String> arreglo){
arreglo.add("seis");
int u=1;

Iterator it = arreglo.iterator();

while(it.hasNext()){
String cad = (String) it.next();
if(cad.equals("uno"))
it.remove();
}


return arreglo;
}


public static void main(String[] args){

int a = 10;
ArrayList<String> arreglo = new ArrayList<String>();

arreglo.add("uno");
arreglo.add("dos");
arreglo.add("tres");
arreglo.add("cuatro");
arreglo.add("cinco");

ArrayList<String> arreglol = modifica(arreglo);

for(String iten : arreglol){
System.out.println(iten + "<br>");
}



}




}
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 03:44.