У меня есть ArrayList для хранения некоторых данных, но всякий раз, когда я удаляю элемент из списка, размер не уменьшается, даже когда я вызываю ArrayList.trimToSize (). Это вызывает у меня nullPointerExceptions.
Как я могу удалить один элемент из ArrayList и соответственно уменьшить размер списка ()?
РЕДАКТИРОВАТЬ: Хорошо, вот код. Вот немного предыстории, которую вы должны знать, так как я не могу опубликовать весь код. У меня есть ArrayList с именем _dataHeap и HashMap с именем _dataMap. ArrayList - это двоичная куча, содержащая «доступный для поиска» объект, имеющий ключ. Привязка HashMap из Key к индексу объекта в ArrayList. Это значит, что элемент в очереди можно найти по элементу, используя HashMap, или по индексу, используя ArrayList. Ключом может быть любой Объект, если он уникален для каждого элемента в очереди.
Я отлаживал эту строку построчно, и куча содержит объект, вплоть до хэш-кода. Проблема в том, что объект никогда не удаляется из ArrayList. Это должно означать, что _dataMap.get (element.getKey ()) не указывает на то, где он должен. Я проверил это, хотя, я использовал тестовый объект за пределами моей реализации, который отображается из строки в пользовательский объект со строкой в качестве ключа.
Я создаю один объект со строкой «один» в качестве ключа. Я вставляю это, затем пытаюсь удалить это. Я прошел через это, и все проверяется, кроме одного: объект никогда не удаляется из очереди. У него тот же хэш-код, тот же ключ, все. Он отлично удаляется с карты, но не из ArrayList.
Вот метод удаления:
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;
Надеюсь, это даст вам лучшее представление о том, что я делаю неправильно.
РЕДАКТИРОВАТЬ ВТОРОЕ: Святое дерьмо, я наконец исправил это! Я вытащил _dataHeap.get (element.index) в его собственную переменную. Это решило ВСЕ!