Исключение приведения класса, вызывающего PriorityQueue - PullRequest
0 голосов
/ 02 января 2019

Метод добавления PriorityQueue выдает исключение приведения класса (MyVertex не может быть приведен к java.lang.Comparable) при выполнении.

Некоторые объекты типа MyVertex вставлены правильно, а некоторые выдает исключение, не удалосьнайдите различия между ними.

См. прикрепленные строки кода в java:

 PriorityQueue<Vertex> pq = new PriorityQueue<>();
 for (Edge edge : vertex.getEdges()) {
      pq.add(edge.getTo());
 }

Ожидается: метод pq.add () не должен вызывать исключение.

1 Ответ

0 голосов
/ 03 января 2019
  1. Реализация интерфейса Comparable и переопределение ComapareTo внутри Vertex класса для удовлетворения порядка приоритетной очереди.

    Как сказано в документе Java - add throwsClassCastException, если указанный элемент не может сравниваться с элементами, находящимися в данный момент в этой приоритетной очереди, в соответствии с порядком приоритетной очереди .

  2. Как вы сказали, он работал раньше, потому что вызов addне будет выбрасывать ClassCastException, если размер priorityQueues равно 0 (при добавлении первого элемента).Чтобы проверить это, перед вызовом цикла for выведите размер vertex.getEdges().size().Если размер больше 0, то будет выброшено ClassCastException.

Когда размер не равен нулю, в качестве базовой структуры данных вочередь с приоритетами здесь - это куча.

Исключение, которое вы видите, инициируется с sift-up, так как для внутреннего поднятия требуется, чтобы ваши элементы реализовали Comparablesift-up вызывается, когда размер очереди приоритета не равен 0 или добавляется следующий элемент.

Примечание:

  • Куча должнаудовлетворять свойству кучи: если P является родительским узлом C, то ключ (значение) P либо больше или равен (в максимальной куче), либо меньше или равен (в минимальной куче) ключуC.

    sift-up: перемещать узел вверх по дереву так долго, как это необходимо;используется для восстановления состояния кучи после вставки.Вызывается "просеять", потому что узел перемещается вверх по дереву, пока не достигнет правильного уровня, как в сите.

Heap_data_structure

...