2013-02-27 15 views
5

kiedy używam ArrayList w Javie, jest kilka rzeczy, których nie rozumiem. Oto mój kod inicjalizacji:ArrayList <Integer> z metodą get/remove

ArrayList<Integer> list = new ArrayList <Integer>(); 
list.add (0); 
list.add (1); 

czasami muszę usunąć obiekt o indeksie:

list.remove (0) // delete the object in the first box 

ale czasami chcę usunąć obiekt za jego zawartość:

list.remove (0) // delete the object HAS Which value of 0 

ten kod jest bardzo niejednoznaczny. Aby wyjaśnić, co chcę zrobić to w kodzie, określić typ takiego:

list.remove ((Object) 0) // delete the object which has a value of 0 

Jeśli nie AC, jedynym sposobem, aby wiedzieć, które metody są nazywane jest umieścić wskaźnik myszy na metody na patrz: java.util.ArrayList.remove boolean (obiekt)

Java Ale jak to robi różnicę? Czy istnieje wskaźnik metody? Czy jest to mniej niejednoznaczny sposób?

Dziękuję bardzo, przepraszam za mój angielski.

PS: Muszę powiedzieć, że w końcu wykorzystane SparseIntArray ale jestem zaciekawiony

Odpowiedz

8

Dla staters. List#remove(index) zwraca obiekt usunięty z listy. List#remove(Object) zwraca wartość logiczną.

Jednak w tym szczególnym przypadku. mógłbyś .

ArrayList<Integer> list = new ArrayList <Integer>(); 
     list.add (0); 
     list.add (1); 
     System.out.println(list.remove(new Integer(0))); 
+0

tak, zauważyłem to. ale jeśli nie używam wartości zwracanej, zastanawiam się, jak Java robi różnicę, jak działa autoboxing. –

+0

@juliendumortier W tym szczególnym scenariuszu jest tylko mylące. ale jeśli myślisz o tym ogólnie w przypadku obiektu, to jest jak. 'list.remove (animal)' lub 'list.remove (watever)'. – PermGenError

+0

ok, dziękuję! ostatnie pytanie. System.out.println (lista.remove ((Integer) 0); To jest dobra/zła praktyka? (dzięki temu unika się tworzenia nowej instancji). –

2

Gdy istnieje dwuznaczność w Java (gdy wiele podpisów metoda może dopasować typy parametrów w czasie kompilacji), używając odlewane wybrać właściwą metodą jest jedynym wyborem. Oczywiście można oddać parametry do zmiennych lokalnych przed faktycznym wywołaniem, ale to nie czyni czytelnika bardziej zrozumiałym - rzutowanie parametru bezpośrednio tam, gdzie jest on używany, jest najlepszą opcją, moim zdaniem, dla wyjaśnienia, która metoda jest nazywany.

Nawiasem mówiąc, powodem, dla którego interfejs API jest tak mało prawdopodobny w tym przypadku, jest fakt, że w momencie tworzenia interfejsu API nie było automatycznego kodowania, więc nie można było napisać niejednoznacznego kodu. Jednak zmiana metody na jednoznaczną byłaby przełomową zmianą. Ponieważ przechowywanie Integer na liście nie jest tak wielką ideą, większość czasu zdecydowała się pozwolić nam żyć z tym lekkim rozdrażnieniem.

1

Jeśli to właśnie niejednoznaczność metodą remove() w Integer ArrayList przeszkadza Ci, można przedłużyć ArrayList do realizacji własnych:

public class MyIntArrayList extends ArrayList<Integer> { 

    boolean removeByObject(Integer intObj) { 
     return super.remove(intObj); 
    } 

    Integer removeByIndex(int index) { 
     return super.remove(index); 
    } 

} 
0

Można użyć list.remove(new Integer(0)) na pewno usunąć obiekt