Java - Como eliminar un objeto de un ArrayList

 
Vista:
sin imagen de perfil

Como eliminar un objeto de un ArrayList

Publicado por Bea (6 intervenciones) el 04/11/2016 15:50:52
Mi problema es el siguiente, necesito borrar un objeto en especifico segun el codigo, al momento de eliminarlo me aparece una excepcion.Este sería el método

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
      * Elimina un establecimiento
      * @param codigo 
      */
    public void eliminarEstablecimiento (String codigo){
        if (!codigo.trim().isEmpty()){
            for (Establecimiento e:listaestablecimientos){
                if (e.getCodigo().equals(codigo)){
                    listaestablecimientos.remove(e);
                    System.out.println (msjElimOk);
                }
            }
        }
    }

Esto el lo que muestra

Exception in thread "main" java.util.ConcurrentModificationException
Se creo la oferta correctamente
Se creo la oferta correctamente
Se creo la oferta correctamente
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at unt.herrera.prog2.GestorEstablecimientos.eliminarEstablecimiento(GestorEstablecimientos.java:217)
at unt.herrera.prog2.Principal.main(Principal.java:118)
Se creo la oferta correctamente
Se eliminó el establecimiento


Como ven me dice que se eliminó el establecimiento pero ademas aparecen esas excepciones, por favor si me pueden decir donde está mi error
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Como eliminar un objeto de un ArrayList

Publicado por Tom (1831 intervenciones) el 04/11/2016 18:02:32
En la doc de ArrayList que ya deberías haber leído dice:
"The iterators returned by this class's iterator and listIterator methods are fail-fast: if the list is structurally modified at any time after the iterator is created, in any way except through the iterator's own remove or add methods, the iterator will throw a ConcurrentModificationException."

Además en google aparecen más de 150.000 resultados cuando buscas ConcurrentModificationException.

La solución es que uses un Iterator, y su método remove(), consulta http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html donde dice:

"Use Iterator instead of the for-each construct when you need to:

Remove the current element. The for-each construct hides the iterator, so you cannot call remove. Therefore, the for-each construct is not usable for filtering.

Iterate over multiple collections in parallel.

"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Como eliminar un objeto de un ArrayList

Publicado por Bea (6 intervenciones) el 07/11/2016 06:09:59
Primero que nada gracias, pero si pregunte debe ser por algo, por algo no busque en esos 150.000 resultados.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 349
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Como eliminar un objeto de un ArrayList

Publicado por Andrés (340 intervenciones) el 05/11/2016 04:57:59
La otra es que sobre escribiendo el método equals, no necesitas iterar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
 
class Establecimiento {
 
	private String codigo;
 
	public Establecimiento(String codigo) {
		super();
		this.codigo = codigo;
	}
 
	public String getCodigo() {
		return codigo;
	}
 
	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}
 
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((codigo == null) ? 0 : codigo.hashCode());
		return result;
	}
 
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Establecimiento other = (Establecimiento) obj;
		if (codigo == null) {
			if (other.codigo != null)
				return false;
		} else if (!codigo.equals(other.codigo))
			return false;
		return true;
	}
 
}
 
public class EliminarEstablecimientos {
 
	public static void main(String[] args) {
 
		Establecimiento e0 = new Establecimiento("E");
		Establecimiento e1 = new Establecimiento("E");
		Establecimiento e2 = new Establecimiento("F");
		Establecimiento e3 = new Establecimiento("G");
		Establecimiento e4 = new Establecimiento("E");
		Establecimiento e5 = new Establecimiento("E");
 
		List<Establecimiento> establecimientos = new ArrayList<Establecimiento>();
		establecimientos.add(e1);
		establecimientos.add(e2);
		establecimientos.add(e3);
		establecimientos.add(e4);
		establecimientos.add(e5);
 
		System.out.println("Antes de eliminar");
		printEstablecimientos(establecimientos);
 
		Collection<Establecimiento> toDelete = new ArrayList<Establecimiento>();
		toDelete.add(e0);
		establecimientos.removeAll(toDelete);
 
		System.out.println("Despúes de eliminar");
		printEstablecimientos(establecimientos);
 
	}
 
	private static void printEstablecimientos(Collection<Establecimiento> establecimientos) {
 
		for(Establecimiento establecimiento : establecimientos) {
 
			System.out.print(establecimiento.getCodigo() + " ");
 
		}
 
	}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Como eliminar un objeto de un ArrayList

Publicado por Joserra (2 intervenciones) el 02/04/2018 20:53:13
Hola. Un poco tarde, cuando a uno le toca, pero Igual a alguien le viene bien.
Obtenía el mismo error al eliminar elementos de un arrayList . En el código que sigue, m.ct es el arrayList. Me cascaba en la línea comentada, al eliinar..

1
2
3
4
5
6
7
8
9
10
11
nombreIterator = m.ct.iterator();
while(nombreIterator.hasNext()){
	Carta elemento = nombreIterator.next();
	if (elemento.iscartaSelected()){
		//   m.ct.remove(elemento) ;
		m.apoyo.add(elemento);
		p3.remove(elemento);
		elemento.setSelected();
	}
}
m.ct.removeAll(m.apoyo);


He creado un arraylist de apoyo al que añado los elementos a borrar y luego los borro todos juntos con el método removeAll(coleccion)
del array list.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar