2010-10-18 11 views
5

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!

+0

¿Puedes publicar el código que estás usando? – highlycaffeinated

+4

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? –

Respuesta

4

Me parece que en realidad no está eliminando nada. ¿Cuál es el valor devuelto de su llamada remove?

Si está utilizando remove(int), el valor de retorno no debe ser nulo. Si usa remove(Object), el resultado debería ser verdadero. De lo contrario, no has eliminado nada. Intentar eliminar un elemento que no existe no es un error, simplemente devuelve nulo o falso.

+0

Puedes estar en algo allí mismo. Acabo de verificar, con una impresión de ArrayList.contains (item) antes y después de quitar ... y ambos son falsos. De alguna manera, no está agregando a la lista correctamente. – digiholic

+1

Entonces, en realidad no estás eliminando nada. O bien Mike tiene razón y olvidaste anular 'iguales' en una clase personalizada, o el objeto que intentas eliminar nunca acaba de agregarse (o ya se eliminó previamente). –

6

Como dijo Bemace, verifique si remove funciona como pretende. Apostaría dinero a que su método equals() sobre el objeto que está redactando no funciona como lo esperaría, porque no lo anuló.

Además, después de anular iguales, tenga cuidado de anular también hashCode. Le ahorrará una pregunta ASÍ cuando su objeto no funciona con HashMaps. :)

Un consejo: Busque en usar JUnit. Expulsará estos pequeños errores directamente del agua, haciéndolo obvio cuando algo no está funcionando como usted esperaría. Es muy difícil ignorar una mancha roja brillante en su hermosa barra verde.

+3

Re: anulando equals y hashcode, debe leer esto: http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java –

+0

De acuerdo, acabo de cambiar equals y Hashcode, pero todavía hay un problema . No puedo resolver esto a tiempo, así que voy a solucionarlo rápidamente, en lugar de eliminarlo, lo reemplazaré por nulo y verificará nulos antes de ejecutar. – digiholic

+0

Publica un código. Probablemente podamos resolverlo rápidamente. – Mike