2010-12-24 19 views
15

To jest część mojego kodu.Problem Java ArrayList.remove()

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

Więc co ja robię tu ja przypisać KeyLocation (pierwsze wystąpienie ciągu znaków w reducedFD ArrayList). Ale kiedy chcę usunąć z someArrayList element z tą keyLocation, to nie zadziała.

Gdybym wprowadzane ręcznie:

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

to faktycznie działa.

Co jest dziwne jest to, że podany kod działa również:

someArrayList.remove(keyLocation + 1); 

Wszelkie wskazówki?

Oto główne pętla:

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

Co to znaczy „nie zadziała”?Komputer uruchamia się ponownie, jak zakładam? –

+1

Przez "to nie zadziała", to znaczy, że w ogóle go nie usuwa. Ignoruje to. – user461316

+0

Czy możesz umieścić swój kod nieco bardziej szczegółowy? Trochę więcej kodu .. – pringlesinn

Odpowiedz

64

Problem polega są przechodzącą liczbą całkowitą metody usunąć, a nie int. Podczas przekazywania liczby całkowitej przyjmuje się, że sam Integer jest tym, co próbujesz usunąć, a nie wartością w tym indeksie. Porównaj sposoby

remove(Object o) 
remove(int i) 

tak zrobić:

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

To przeleciało nad moją głową. Wielkie dzięki. – user461316

+0

Utknąłem na tym przez ponad godzinę .. Dzięki koleś ... :) – LPD

+1

Dzięki za tak prosty, a jednak tak głupi błąd :) – test

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

Interfejs List ma dwa remove() metody, który odbiera Object (i próbuje usunąć ten obiekt z listy), a inny, że odbiera int (i próbuje usunąć obiekt, którego indeks jest podanym int).

Zazwyczaj podanie metody parametru Integer powoduje automatyczne rozpakowywanie lub automatyczną transformację do pierwotnej wartości int. W tym przypadku kompilator nie podejmie próby automatycznego rozpakowania, ponieważ istnieje niezła metoda, która odbiera Object i Integer instanceof Object ... Zgaduję, że twoja lista nie jest List<Integer>, dlatego nie działa ona spektakularnie.

Dodanie int do twojego Integer wymusza automatyczne rozpakowywanie, a dodanie powoduje, że int - jest idealny dla innej metody .

12

Oto krótki opis:

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

jeśli piszesz .remove(5) kompilator rozumie go jako prymitywny typ tak indeksu i usunąć index(5). Jeśli chcesz usunąć obiekt, który powinien napisać .remove(new Integer(5))

+0

dziękuję dużo, miła sztuczka;) – Q8Y

+0

new Integer() działało idealnie dla mnie, thx! – Zakhar

+0

to działa również dla mnie! – kojh

0

Lub możesz po prostu zrobić:

someArrayList.remove(keyLocation + 0); 
0

You ca n nazywają to zamiast tworzenia int

someArrayList.remove(integerKeyLocation.intValue()); 
Powiązane problemy