2013-02-27 11 views
5

quando uso ArrayList in Java, ci sono alcune cose che non capisco. Qui è il mio codice di inizializzazione:ArrayList <Integer> con il metodo get/remove

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

volte ho bisogno di eliminare un oggetto dal suo indice:

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

ma a volte voglio eliminare un oggetto dal suo contenuto:

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

questo codice è molto ambiguo. Per chiarire quello che voglio farlo in codice, a specificare il tipo in questo modo:

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

Se non mi AC, l'unico modo per sapere quali metodi sono chiamati è quello di mettere il puntatore del mouse sul metodo di vedi: java.util.ArrayList.remove boolean (oggetto Object)

Java Ma come fa la differenza? c'è un puntatore del metodo? C'è un modo meno ambiguo per farlo?

grazie mille, mi dispiace per il mio inglese.

PS: devo dire che alla fine ho usato SparseIntArray ma sono stranamente

risposta

8

Per staters. List#remove(index) restituisce l'oggetto rimosso dall'elenco. List#remove(Object) restituisce un valore booleano.

In questo caso speciale tuttavia. potresti farlo

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

sì, ho notato questo. ma se non utilizzo il valore restituito, mi chiedo in che modo Java faccia la differenza, come funziona il boxing automatico. –

+0

@juliendumortier È solo un po 'di confusione in questo particolare scenario. ma se ci pensate in generale in caso di oggetti è come. 'list.remove (animale)' o 'list.remove (watever)'. – PermGenError

+0

ok grazie! ultima domanda. System.out.println (lista.remove ((Intero) 0); questa è una buona/cattiva pratica? (questo evita di creare una nuova istanza). –

2

Ogni volta che c'è un'ambiguità in Java (quando il metodo più firme potrebbero corrispondere ai tipi dei parametri in fase di compilazione), utilizzando calchi di scegliere il metodo giusto è l'unica scelta. Naturalmente è possibile trasmettere i parametri alle variabili locali prima dell'invocazione effettiva, ma ciò non rende più chiaro per il lettore: la scelta del parametro direttamente dove è utilizzata è l'opzione migliore, a mio avviso, per chiarire quale metodo è chiamato.

Tra l'altro, il motivo per cui l'API è così ambiguo in questo caso è che al momento dell'API non esisteva il Box automatico, quindi non era possibile scrivere codice ambiguo in primo luogo. Tuttavia, cambiare il metodo per renderlo inequivocabile sarebbe stato un cambiamento decisivo. Dal momento che la memorizzazione di Integer in un arraylist non è una grande idea comunque, la maggior parte delle volte, hanno deciso di lasciarci vivere con quel leggero fastidio.

1

Se è solo l'ambiguità con il metodo remove() in Integer ArrayList ti dà fastidio, è possibile estendere l'ArrayList per implementare il proprio:

public class MyIntArrayList extends ArrayList<Integer> { 

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

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

} 
0

Si potrebbe utilizzare list.remove(new Integer(0)) per rimuovere sicuramente l'oggetto

Problemi correlati