Вопрос с собеседования · Java

В каком порядке выдаёт элементы итерация (for-each) по PriorityQueue?

MiddleКоллекции
Коротко

Итерация по PriorityQueue не отсортирована: куча гарантирует только «родитель ≤ детей». Отсортированный порядок даёт лишь повторный poll().

  • toString и for-each показывают массив кучи как есть
  • Отсортировать — poll() в цикле или скопировать и отсортировать
  • peek и poll возвращают минимум по Comparable или компаратору

А ещё Классическая ловушка: «распечатал очередь — порядок неправильный»

Попробуйте сами

Двоичная куча: вставка и извлечение

Подробно

PriorityQueue — бинарная куча в массиве: гарантируется лишь свойство кучи (родитель не больше детей), а не полный порядок. Поэтому for-each/toString выдают элементы как они лежат в массиве; отсортированную последовательность получают, многократно вызывая poll(). Это классическая ловушка «распечатал очередь и жду сортировки».

Что хотят услышать

  • Свойство кучи и почему итерация не отсортирована.
  • Как получить порядок.

Частые ошибки

  • Ждать отсортированный обход PriorityQueue.
  • Полагаться на порядок toString().

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓В частично упорядоченном порядке кучи; сортировку даёт только poll()
  • ✗Строго по возрастанию приоритета — итератор обходит кучу в отсортированном порядке
  • ✗В порядке вставки (FIFO)
  • ✗В обратном порядке вставки (LIFO)

Что спросят дальше

  • Какая сложность у poll() в куче?
  • Как получить отсортированный список из кучи?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования