Tengo un ArrayList para almacenar algunos datos, pero cada vez que elimino un elemento de la lista, el tamaño no disminuye, incluso cuando llamo ArrayList.trimToSize() . Esto me está causando nullPointerExceptions.Java ArrayList.remove() no disminuye el tamaño del ArrayList
¿Cómo puedo eliminar un solo elemento de una ArrayList y hacer que el tamaño de la lista() se reduzca en consecuencia?
EDITAR: Bien, aquí está el código. Aquí hay un poco de antecedentes que necesitarás saber, ya que no puedo publicar todo el código. Tengo un ArrayList llamado _dataHeap y un HashMap llamado _dataMap. ArrayList es un montón binario que contiene un objeto "localizable", que tiene una clave. HashMap se vincula desde una clave al índice del objeto en ArrayList. Esto es para que un ítem en la cola pueda ser encontrado por ítem usando el HashMap o por índice usando ArrayList. La clave puede ser cualquier objeto, siempre que sea único para cada elemento en la cola.
He depurado esta línea por línea, y el Heap contiene el objeto, incluso hasta el Hashcode. El problema es que el objeto nunca se elimina de ArrayList. Esto debe significar que _dataMap.get (element.getKey()) no apunta hacia donde debería. Aunque lo he comprobado, utilicé un objeto de prueba fuera de mi implementación que mapea desde una cadena a un objeto personalizado con cadena como clave.
Hago un objeto, con la cadena "uno" como clave. Lo inserto, luego trato de eliminarlo. Pasé por esto y todo se comprueba, excepto una cosa: el objeto nunca se elimina de la cola. Tiene el mismo Hashcode, la misma clave, todo. Se elimina del mapa muy bien, pero no de ArrayList.
Aquí está el método remove:
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;
espero que esto le da una mejor idea de lo que estoy haciendo mal.
EDITAR LA SEGUNDA: Santa mierda ¡Finalmente lo arreglé! Saqué _dataHeap.get (element.index) en su propia variable. ¡Eso resolvió TODO!
¿Puedes publicar el código que estás usando? – highlycaffeinated
No debería necesitar llamar 'trimToSize()', y 'remove()' _should_ actualizará correctamente el tamaño de la lista. ¿Quizás podría publicar un [SSCCE] (http://sscce.org/) que ilustre el problema? –