Как я могу получить n-й предмет в очереди? - PullRequest
5 голосов
/ 09 марта 2012

У меня есть несколько очередей и приоритетных очередей в моем приложении.Я хотел бы легко получить доступ к n-м элементам в этих очередях, но не вижу простого способа сделать это с помощью API.

Я думаю, я мог бы создать Iterator и перейти к n-му элементуиспользуйте toArray()[index], но похоже, что должен быть более простой способ.

Я что-то упустил?

Ответы [ 5 ]

19 голосов
/ 09 марта 2012

Я что-то упустил?

Да - тот факт, что доступ к элементам по индексу не является частью концепции очереди.

Если вам нужен доступэлементы по индексу, вам нужен список, а не очередь.

2 голосов
/ 09 марта 2012

Самое простое решение для вас - использовать binary search tree, который является самобалансирующимся, например, AVL tree, splay tree or red-black tree. Это позволяет вам получить доступ к элементам по их ключу за O (log n) время и перебрать объекты в их порядке в O (log n + k) , где k - число элементы повторяются .. !!

2 голосов
/ 09 марта 2012

Весь смысл очереди в том, чтобы выставлять доступ только голове (первый элемент).Если вы хотите произвольный доступ к элементам в линейной структуре данных, используйте List (если вы выполняете намного больше операций поиска, чем push / pop, рассмотрите возможность использования ArrayList, так как LinkedList s не оптимизированы для произвольного доступа).

1 голос
/ 09 марта 2012

Очереди не допускают случайного индексированного доступа по концепции, поэтому хорошо, что интерфейс этого тоже не допускает. Если вам нужны оба вида доступа одновременно (что является плохим признаком для проектирования), вы можете использовать тип данных, который реализует оба типа List и Queue (например, LinkedList).

1 голос
/ 09 марта 2012

У меня есть несколько очередей и очередей с приоритетами в моем приложении

Какой конкретный тип данных вы используете для Queues?A LinkedList? В этом случае вы сможете получить элемент n th, приведя обратно к связанному списку.

Но это не то, как вы бы использовали Queue

Что касается очереди с приоритетами, из вашего вопроса кажется, что вы также не используете правильные структуры данных.

Приоритетная очередь всегда будет возвращать элемент min (по порядку).
Так что вы имеете в виду здесь элемент n? Наименьший n или вставленный n или как?Поэтому мы не можем сказать, что делать в этом случае

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...