В Java я хочу хранить элементы в порядке возрастания по размеру.Перед вставкой мне нужно обработать все мелкие элементы.Поэтому я начинаю перечислять список, относящийся к меньшим элементам, и когда я встречаю более крупный элемент, я хочу вставить новый узел перед этим более крупным элементом.Какая структура данных будет хорошим выбором?ArrayList
не может быть хорошим выбором, поскольку при вставке в середине элементы сдвигаются вправо.Я посмотрел на API LinkedList
, но я не нахожу методов для вставки до / после данного узла в списке.Существует метод add
, который «вставляет указанный элемент в указанную позицию в этом списке», но для него требуется позиция в виде целого числа.Значит ли это, что реализация Java обходит список с самого начала, пока не найдет указанную позицию?Это кажется довольно дорогим.У меня есть позиция (узел), куда я хочу вставить, только некоторые ссылки должны быть изменены правильно, чтобы включить новый узел в список.Любые предложения?
Спасибо,
Джабба
Обновление: Спасибо всем за ответы, я мог решить проблему с LinkedList с помощью ListIterator.Затем я провел сравнительный тест и получил удивительные результаты.Итак, цель состоит в том, чтобы поддерживать элементы в списке / массиве отсортированным образом.Для этого я сравнил четыре варианта: (1) Vector, (2) ArrayList, (3) LinkedList и (4) MyLinkedList, это моя собственная реализация (очень простая).Для теста я создал массив из 1000 элементов и заполнил его случайными целыми числами от 1 до 100. Затем я добавил эти элементы в каждый контейнер в цикле.При добавлении этого массива 30 раз: MyLinkedList (2,7 с), LinkedList (6,6 с), ArrayList (6,9 с), Vector (7,5 с).Добавление массива 100 раз: MyLinkedList (80,7 с), ArrayList (82,5 с), Vector (92,7 с), LinkedList (176,3 с).Добавление массива 200 раз: ArrayList (304,3 с), Vector (332,7 с), MyLinkedList (381,2 с), LinkedList (610,4 с). Вывод: ArrayList всегда быстрее, чем Vector.Поскольку это не синхронизировано, это не очень удивительно.Хотя разница не слишком значительна.Если список не слишком велик (до 100 000 элементов в моем случае), я получил лучшую производительность с собственной реализацией.Удивительно, но LinkedList работает довольно плохо.По мере роста размера списка LinkedList становится все хуже и хуже.Окончательный вывод: если список не слишком большой, вы можете добиться лучшей производительности с собственной реализацией.Если размер списка очень большой, используйте ArrayList.Этот результат удивляет меня, потому что ArrayList должен перемещать много элементов, в то время как связанный список должен только изменить некоторые ссылки.Но поскольку ArrayList основан на массиве, несмотря на большое количество сдвигов, он может превзойти связанный список.
Дополнительная информация: Во всех четырех случаях при вставке нового элемента я перечисляюсписок с начала, пока я не найду элемент большего размера, затем я вставлю новый узел перед ним.Я делаю это, потому что приложение должно обрабатывать меньшие элементы.Вот почему я не выполняю бинарный поиск в Vector и ArrayList.