2010-12-24 9 views
15

Esto es parte de mi código.Java ArrayList.remove() problema

Integer keyLocation = reducedFD.indexOf(KeyPlus.get(KEYindex)); 
someArrayList.remove(keyLocation); 

Entonces, ¿qué estoy haciendo aquí es asigno keyLocation (la primera ocurrencia de una cadena en el reducedFD arrayList). Pero cuando quiero eliminar de algún ArrayList el elemento con esa KeyLocation, no funcionará.

Si introducir manualmente:

someArrayList.remove(0); //Let's say 0 is the actual keyLocation 

Esto funciona en realidad.

Lo que es raro es que el código siguiente también funciona:

someArrayList.remove(keyLocation + 1); 

¿Alguna pista?

Aquí es el bucle principal:

for (int KEYindex = 0; KEYindex < KeyPlus.size(); KEYindex++){ 

Integer keyLocation = reducedFD.indexOf(KeyPlus.get(KEYindex)); 

if (reducedFD.contains(KeyPlus.get(KEYindex))){ 

KeyPlus.add(reducedFD.get(keyLocation+1)); 
CheckedAttributesPlus.add(KeyPlus.get(KEYindex)); 
reducedFD.remove(keyLocation); 

} 
} 
+1

¿qué quiere decir "no va a funcionar"?La computadora se reinicia, supongo? –

+1

Por "no funcionará", quiero decir que no lo elimina en absoluto. Lo ignora – user461316

+0

¿Puedes poner tu código un poco más detallado? Un poco más de código ... – pringlesinn

Respuesta

64

El problema es que usted está pasando un entero en el método remove, y no un int. Cuando pasas un Entero, asume que el Entero en sí es lo que estás tratando de eliminar, no el valor en ese índice. Comparar los métodos

remove(Object o) 
remove(int i) 

también lo hacen:

int keyLocation = reducedFD.indexOf(KeyPlus.get(KEYindex)); 
someArrayList.remove(keyLocation); 
+4

Eso voló justo sobre mi cabeza. Muchas gracias. – user461316

+0

Estuve atascado en esto por más de una hora ... Gracias amigo ... :) – LPD

+1

Gracias por este error tan simple, pero tan estúpido :) – test

1
int keyLocation = reducedFD.indexOf(KeyPlus.get(KEYindex)); //Use a primitive int 
    someArrayList.remove(keyLocation); 
3

La interfaz List tiene dos remove() métodos, uno que recibe un Object (y trata de eliminar este objeto de la lista) y otro que recibe un int (e intenta eliminar el objeto cuyo índice es el int dado).

Normalmente, al dar un método, un parámetro Integer da como resultado el auto-unboxing, o la transformación automática a una primitiva int. En este caso, el compilador no intentará el auto-unboxing, porque hay un método perfectamente bueno que recibe Object y Integer instanceof Object ... Supongo que su lista no es List<Integer>, razón por la cual falla espectacularmente.

Añadiendo un int a su Integer fuerzas de auto-unboxing, y la adición resulta en un int - perfecto para el otro método remove().

12

Aquí es breve descripción:

remove(Object o) // remove object 
remove(int index) // remove the object in that index 

si se escribe .remove(5) compilador entiende como un tipo primitivo de modo que un índice y quitar index(5). Si desea eliminar objeto que debe escribir .remove(new Integer(5))

+0

muchas gracias, buen truco;) – Q8Y

+0

nuevo entero() funcionó perfectamente para mí, ¡gracias! – Zakhar

+0

me funciona también gracias! – kojh

0

O simplemente puede hacer:

someArrayList.remove(keyLocation + 0); 
0

Usted ca n llamar a este lugar de crear una int

someArrayList.remove(integerKeyLocation.intValue());