2013-12-11 2 views
0

Я хочу иметь общий двойной список, где, когда я создаю список (где точка имеет getX() & getY()), теперь она также имеет getPrev() и getNext(), где prev/next - предыдущий/следующий объект в списке.вывести следующий/prev указатель в общий список

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

спасибо - Дэйв

+1

Нет, если вы не можете наследовать из общего базового класса или все ваши классы повторно реализуют функции getNext()/getPrev() общего интерфейса, это приемлемые решения? – nos

+0

Любые конкретные причины, по которым вы не хотите откатывать свои собственные? – turbo

+0

@nos Я думаю, что так должно работать - что шаблонный класс должен реализовать интерфейс с предыдущими() и next(). Есть ли класс, который это делает? –

ответ

2

java.util.LinkedList<E> уже дважды связанный список. LinkedList.listIterator(int) возвращает объект ListIterator<E>, который предоставляет методы next() и previous(), между прочим.

+0

Проблема заключается в том, что объект списка раскрывает следующий и предыдущий. Я хочу, чтобы мои объекты, содержащиеся в списке, предоставили следующие и предыдущие методы. –

+0

@DavidThielen, В этом случае, без каких-либо изменений shenanigans, чтобы получить доступ к частному классу 'LinkedList.Entry', ваш единственный вариант - сделать свой собственный. –

0

Я не думаю, что вы можете с java.util.LinkedList

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/LinkedList.java#LinkedList

Посмотрите на линии 95. Класс только Отслеживает к главе списка, так что каждый вызовов в GetNext и getPrev всегда будет работать в O (N) time never O (1)

Вы не можете использовать LinkedList (либо a, либо имеет отношение) для реализации методов getNext и getPrev и использовать эти методы в постоянное время , Поскольку класс сущности является закрытым в LinkedList, то есть указатель на заголовок списка. Вы можете сделать это в O (n), как это getNext(get(cursor++));, так как get принимает время O (n). Есть способы сделать это (refletion), но вам лучше всего написать собственную реализацию связанного списка или жить с ListIterator.

+0

'LinkedList' не имеет метода getNext' /' getPrev', поэтому тот факт, что он отслеживает только голова, не является проблемой. Единственное публичное обратное next/prev, относящееся к 'LinkedList', происходит из интерфейса ListIterator, который правильно реализован (в частном внутреннем классе' LinkedList', 'ListIter'). –

+0

Я знаю, что у него нет getNext, getPrev и не должно. Для этого и предназначен ListIterator. – robbmj

+0

Если вы понимаете цель и использование итератора, то я не понимаю, почему вы говорите о следующих операциях O (N). Источник, с которым вы связались, показывает «ListIter» с операциями O (1) для обоих методов. –

Смежные вопросы