2010-08-26 19 views
12

Ho una lista array, che include un numero di elementi che voglio rimuovere. Ho gli ID degli elementi da rimuovere memorizzati in un altro elenco. Figured il seguente codice dovrebbe funzionare banalmente, ma per qualche ragione, il remove() le chiamate stanno tornando un valore falso:Perché la mia chiamata ArrayList.remove (id) non funziona?

ArrayList<Integer> toRemove = new ArrayList<Integer>(); 
    ArrayList<JCheckBox> al = new ArrayList<JCheckBox>(); 

    /* Code that adds a bunch of items to al, and a few integers to toRemove */ 

    System.out.println("Size before removing: " + al.size()); 
    for (int i = toRemove.size() - 1; i >= 0; i--) { 
    System.out.println("Removing id: " + toRemove.get(i) + ": "); 
    System.out.println(al.get(toRemove.get(i))); 
    System.out.println(al.remove(toRemove.get(i))); 
    } 
    System.out.println("Size after removing: " + al.size()); 

che avrei avuto se la get() chiamata anche restituito un valore falso, ma è restituisce effettivamente l'oggetto in questione. Cosa mi manca qui?

L'uscita del codice di cui sopra:

Size before removing: 3 
Removing id: 2: 
javax.swing.JCheckBox[...] 
false 
Size after removing: 3 
+0

Puoi pubblicare dichiarazioni esatte per "al" e "toRimuovi"? –

+0

Inserito le definizioni richieste. – zigdon

risposta

31

La mia ipotesi è che si sta avendo un problema con il fatto che remove() è sovraccarico di entrambi int e Object, mentre get() richiede solo un int. Prova remove(toRemove.get(i).intValue()).

remove(Object) da AbstractCollection cercherà l'elenco e rimuovere l'oggetto dato, che non sarà lì perché si sta inviando un Integer e l'elenco ha solo JCheckBox s. Stai provando a chiamare remove(int), ma poiché gli stai dando un Integer, viene chiamato il sovraccarico Oggetto. Convertendo lo Integer in un int, si evita questo problema

Inoltre, si può sempre essere sicuri che l'ID in toRemove è sempre uguale all'indice? Se toRemove non è nel massimo ordine, non lo sarà.

+0

Grazie - ha funzionato! E sì, quando costruisco ToRemove, sono sicuro che sia in ordine, in modo che quando lo passo in ordine inverso, non ho bisogno di aggiustare gli indici man mano che gli elementi vengono rimossi. – zigdon

+0

Questa risposta non considera gli oggetti 'NULL' – Salman

+0

@Salman La domanda implica che non ci sono' null's. Se fosse presente un 'nullo ', la riga sopra la chiamata' remove() 'genererebbe un puntatore nullo mentre disattiverebbe l'argomento alla chiamata esterna' get() '. – ILMTitan

1

Ci sono due problemi con il codice. In primo luogo, viene richiamato il metodo "toRemove" errato. Quando chiami "toRemove.get (i)", il valore di ritorno è autoboxed in un java.lang.Integer, invece di un int. Pertanto, java.util.List # remove (Object) viene chiamato al posto di java.util.List # remove (int). Sta cercando di rimuovere un oggetto intero e restituisce false. Se si esegue il numero intero su un valore int, il metodo desiderato verrà richiamato.

Secondo problema: ogni volta che si rimuove un elemento dell'elenco, gli indici di tutti gli elementi successivi cambiano, poiché tali elementi vengono "spostati" verso il basso. Ci sono diversi modi per aggirare questo. Uno è quello di ordinare l'elenco degli indici in ordine decrescente. Un altro sarebbe utilizzare un set di indici, creare un nuovo array e copiare nel nuovo array solo quegli elementi il ​​cui indice non è nel set.

Problemi correlati