Низкоуровневый доступ к Java LinkedList? - PullRequest
3 голосов
/ 25 марта 2011

У меня есть список элементов, содержащих несколько конкретных специальных элементов, и мне нужно найти соседей этих элементов в постоянное время. Это звучит просто, если использовать двусвязный список: просто храните ссылки на узлы, содержащие эти конкретные элементы, и проверяйте их предыдущий и следующий узлы. (Я также предпочитаю использовать связанный список, поскольку я постоянно удаляю и добавляю элементы. Список большой, а производительность особенно важна.)

Однако, похоже, что Java LinkedList не позволяет мне хранить узел, содержащий элемент. Это правильно? Если так, есть ли чистый способ сделать то, что мне нужно сделать? Это не должно быть сложно, но я не нашел решения.

Это должно работать с постоянно меняющимся списком, и я предпочитаю не обновлять что-либо во время изменений (например, если бы я использовал массив, мне пришлось бы постоянно обновлять их индексы всякий раз, когда они перемещались в массиве). Кроме того, в будущем мне может понадобиться пройти по списку, начиная с этого специального узла, не теряя времени на поиск этого узла (что также было бы легко в низкоуровневой реализации связанного списка), поэтому я был бы еще более благодарен за решение, которое также решило это.

Редактировать: Спасибо за ответы. Я надеялся на решение, которое не включало бы реализацию моей собственной версии связанного списка. Есть ли один?

Ответы [ 2 ]

2 голосов
/ 25 марта 2011

Я думаю, что реализация вашего собственного двусвязного класса списка - это единственный способ получить оптимальную производительность для вашего приложения.

Стандартные реализации списка работают с использованием абстракции / скрытия информации для поддержки инвариантов списка.В результате они «просто работают» ... по модулю приложение выполняет правильные действия в отношении синхронизации, если задействованы несколько потоков.

Вы хотите (и, возможно, должны) изучить детали абстракции и перейти кдетали реализации, а затем делать вещи, которые потенциально могут привести к нарушению инвариантов.Не поддерживается.

1 голос
/ 25 марта 2011

Вы можете использовать ListIterator с его методами next () и previous ().Примечание. ListIterator становится недействительным, если вы каким-либо образом изменили список без использования ListIterator.

Или вы можете использовать индекс для ArrayList.

...