Mam ArrayList do przechowywania niektórych danych, ale gdy tylko usunę element z listy, rozmiar nie zmniejsza się, nawet gdy wywołuję ArrayList.trimToSize() . To powoduje mi nullPointerExceptions.Java ArrayList.remove() nie zmniejszając rozmiaru ArrayList
Jak mogę usunąć pojedynczy przedmiot z tablicy ArrayList i odpowiednio zmniejszyć rozmiar listy()?
EDYCJA: W porządku, oto kod. Oto trochę tła, które musisz znać, ponieważ nie mogę opublikować całego kodu. Mam ArrayList nazwie _dataHeap i HashMap nazwie _dataMap. ArrayList jest binarną stertą zawierającą "możliwy do znalezienia" obiekt, który ma klucz. HashMap wiąże się z klucza do indeksu obiektu w tablicy ArrayList. Dzieje się tak dlatego, że przedmiot w kolejce można znaleźć za pomocą elementu z użyciem HashMap lub według indeksu przy użyciu ArrayList. Kluczem może być dowolny obiekt, o ile jest unikalny dla każdego elementu w kolejce.
I debugowałem ten wiersz po linii, a sterty zawiera obiekt, nawet do Hashcode. Problem polega na tym, że obiekt nie jest nigdy usuwany z ArrayList. Musi to oznaczać, że _dataMap.get (element.getKey()) nie wskazuje, gdzie powinien. Sprawdziłem to jednak, użyłem obiektu testowego poza moją implementacją, który mapuje z ciągu do niestandardowego obiektu z ciągiem jako kluczem.
Tworzę jeden obiekt, z napisem "jeden" jako jego klucz. Wstawiam, a następnie próbuję go usunąć. Przeszedłem przez to i wszystko się zgadza, z wyjątkiem jednej rzeczy: Obiekt nigdy nie jest usuwany z kolejki. Ma ten sam Hashcode, ten sam klucz, wszystko. Zostaje usunięty z mapy, ale nie z ArrayList.
Oto metoda 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;
Mam nadzieję, że to daje lepsze wyobrażenie o tym, co robię źle.
EDYTUJ DRUGI: Holy crap W końcu to naprawiłem! Wyciągnąłem plik _dataHeap.get (element.index) do własnej zmiennej. To rozwiązało WSZYSTKO!
Czy możesz opublikować kod, którego używasz? – highlycaffeinated
Nie trzeba wywoływać 'trimToSize()', a 'remove()' _should_ poprawnie aktualizuje rozmiar listy. Być może mógłbyś opublikować [SSCCE] (http://sscce.org/), który ilustruje problem? –