Java ArrayList.remove () не уменьшает размер ArrayList - PullRequest
5 голосов
/ 19 октября 2010

У меня есть 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) в его собственную переменную. Это решило ВСЕ!

Ответы [ 2 ]

6 голосов
/ 19 октября 2010

Как сказал Bemace, проверьте, работает ли remove так, как вы собираетесь.Держу пари, что ваш метод equals () для объекта, который вы составляете, не работает так, как вы ожидаете, потому что вы не переопределяете его.позаботьтесь также о переопределении hashCode.Это избавит вас от SO вопроса, когда ваш объект не работает с HashMaps.:)

Совет: изучите использование JUnit .Эти маленькие ошибки вылетят прямо из воды, и вам станет ясно, когда что-то не работает, как вы надеетесь.Очень трудно игнорировать ярко-красное пятно на вашей красивой зеленой полосе.

4 голосов
/ 19 октября 2010

Звучит так, будто вы ничего не удаляете.Каково возвращаемое значение вашего remove вызова?

Если вы используете remove(int), возвращаемое значение должно быть ненулевым.При использовании remove(Object) результат должен быть истинным.В противном случае вы на самом деле ничего не удалили.Попытка удалить элемент, который не существует, не является ошибкой, просто возвращает null или false .

...