Эквивалент std :: deque в Java

Я относительно новый программист на Java, пришедший из C++ / STL, и ищу класс с этими характеристиками (которые, как я понимаю, имеет C++ std :: deque):

  1. O (1) производительность для вставки / удаления в начале / конце
  2. O (1) производительность поиска по индексу
  3. являются растущими коллекциями (не нуждаются в фиксированных границах размера)

Есть ли этому эквиваленту в Java? Я нашел класс Java 1.6 [ArrayDeque], который имеет характеристики вставки / удаления и увеличения, но, похоже, не имеет поиска по индексу, если вы не вызываете toArray (), который не был бы O (1).

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
11
0
2 233
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

В примитивных коллекциях для Java есть ArrayDeque с методом get (int idx).

http://sourceforge.net/projects/pcj

Однако я не могу поручиться за качество этого проекта.

Альтернативой может быть получение источника JDK ArrayDeque и самостоятельное добавление метода get (int idx). Должно быть относительно легко.

Обновлено: Если вы намереваетесь использовать двухстороннюю очередь в многопоточном режиме, я бы пошел по маршруту «патч JDK ArrayDeque». Эта реализация была тщательно протестирована и используется в новом фреймворке java.util.concurrent ForkJoin.

Исходный код для пути к классам GNU ArrayDeque находится здесь: fuseyism.com/classpath/doc/java/util/ArrayDeque-source.html. Должно быть достаточно легко добавить get (i) или даже заставить его реализовать List <E>

Todd Gamblin 08.12.2008 19:49

PCJ работает только с примитивными типами, что весьма ограничивает его полезность.

Michael Myers 08.12.2008 20:01

Интересно ... Материал GNU меня пугает (хотя в лицензии на указанный вами код ArrayDeque указано Creative Commons ... странно), потому что я работаю в коммерческой среде и не могу использовать какой-либо код GPL.

Jason S 08.12.2008 20:07

Вы можете использовать бэкпорт JSR166 по адресу: backport-jsr166.sourceforge.net Он выпущен в общественное достояние; нет проблем с лицензированием.

bajafresh4life 08.12.2008 21:33

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

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

Daddy Warbox 08.12.2008 20:18

Интересно ... Я как раз заканчивал чтение Обобщения и коллекции Java, и в нем есть краткое обсуждение такого рода коллекции, включая ссылку на Информационный бюллетень специалистов по Java, который включает CircularArrayList, который может делать то, что мне нужно.

Вот готовый к использованию кольцевой буфер, реализованный на Java, CircularArrayList. Однако после создания его нельзя выращивать. (Отказ от ответственности: эта ссылка указывает на мой собственный веб-сайт)

Другой вариант, распространенный в сети, - это один из бюллетеня Java Specialists Newsletter. Я никогда не использовал его по следующим причинам:

  1. Он неполный - («Этот метод оставлен читателю в качестве упражнения»)
  2. Он не поддерживает универсальный тип элемента, как это было бы согласовано с другими коллекциями из Java Collection Framework.
  3. Это излишне сложно и, следовательно, возможно, содержит ошибки, вместо того, чтобы следовать процедуре расширения, рекомендованной Javadoc от AbstractList.

Другие вопросы по теме