Ho un ArrayList per memorizzare alcuni dati, ma ogni volta che rimuovo un elemento dall'elenco, la dimensione non diminuisce, anche quando chiamo ArrayList.trimToSize() . Questo mi sta causando nullPointerExceptions.Java ArrayList.remove() non decrementa la dimensione di ArrayList
Come posso rimuovere un singolo elemento da un ArrayList e le dimensioni dell'elenco() si riducono di conseguenza?
MODIFICA: va bene, ecco il codice. Ecco un po 'di background che devi sapere, dal momento che non posso pubblicare tutto il codice. Ho una ArrayList chiamata _dataHeap e una HashMap chiamata _dataMap. ArrayList è un heap binario contenente un oggetto "findable", che ha una chiave. HashMap esegue il bind da una chiave all'indice dell'oggetto in ArrayList. Questo è un elemento in coda che può essere trovato per elemento usando la HashMap o l'indice usando ArrayList. La chiave può essere qualsiasi oggetto, purché sia univoco per ogni elemento della coda.
Ho eseguito il debug di questa riga per riga e l'heap contiene l'oggetto, anche fino all'Hashcode. Il problema è che l'Oggetto non viene mai rimosso da ArrayList. Questo deve significare che _dataMap.get (element.getKey()) non punta a dove dovrebbe. L'ho verificato però, ho usato un oggetto di prova al di fuori della mia implementazione che esegue il mapping da una stringa a un oggetto personalizzato con String come chiave.
Faccio un oggetto, con la stringa "uno" come chiave. Lo inserisco, quindi provo a rimuoverlo. L'ho passato e tutto si verifica, tranne una cosa: l'oggetto non viene mai rimosso dalla coda. Ha lo stesso Hashcode, la stessa chiave, tutto. Viene rimosso dalla mappa bene, ma non da ArrayList.
Ecco il metodo di rimozione:
public T remove(T element) {
//We'll need this data to return the proper value
T t = _dataHeap.get(_dataMap.get(element.getKey()));
/*
* this Swap() call is used to swap our target with the end
* of the arraylist. This means that whenever we remove it,
* we don't have a change in indexes of the other nodes.
* After that, we downHeapify() to fix the whole graph back
* to it's functional state.
*/
swap(_dataMap.get(element.getKey()),length()-1);
//Remove from the Heap
_dataHeap.remove(_dataMap.get(element.getKey()));
_dataHeap.trimToSize();
//Remove from the Map
_dataMap.remove(element.getKey());
downHeapify();
return t;
Spero che questo ti dà una migliore idea di quello che sto facendo male.
MODIFICA IL SECONDO: Santo schifo Ho finalmente risolto! Ho tirato il _dataHeap.get (element.index) nella sua variabile. Questo ha risolto TUTTO!
Puoi pubblicare il codice che stai utilizzando? – highlycaffeinated
Non dovresti aver bisogno di chiamare 'trimToSize()', e 'remove()' _should_ aggiorna correttamente la dimensione della lista. Forse potresti pubblicare un [SSCCE] (http://sscce.org/) che illustra il problema? –