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