Понимание того, как переопределение работает с compareTo в очереди приоритетов Java?

Я создаю очередь с пользовательским приоритетом, в которой я по существу помещаю объекты в PQ и сортирую по определенному ключу в этом объекте:

Класс входа в приоритетную очередь

package Graphs;

public class PQEntry implements Comparable<PQEntry> {
    public int node;
    public int nodeVal;

    public PQEntry(int node, int nodeVal) {
        this.node = node;
        this.nodeVal = nodeVal;
    }

    @Override
    public String toString() {
        return "Node: " + this.node + ", Value: " + this.nodeVal;
    }

    public int getNodeVal() {
        return this.nodeVal;
    }

    @Override
    public int compareTo(PQEntry other) {
        return Integer.compare(this.getNodeVal(), other.nodeVal);
    }
}

Теперь все в порядке, приоритет работает как надо:

PriorityQueue<PQEntry> pq = new PriorityQueue();

Но я новичок в Java, и я не понимаю, как/где/когда compareTo в моем классе PQEntry применяется к классу PriorityQueue и как это работает.

Когда я вызываю функцию add внутри PriorityQueue, инициирует ли она какой-то алгоритм подкачки, вызывающий суперметод из моего класса PQEntry? Я действительно немного новичок в Java и пытаюсь понять здесь процесс.


person John L.    schedule 21.10.2017    source источник


Ответы (1)


Я постараюсь прояснить для вас кое-что.

В документации PriorityQueue вы найдете обратите внимание, что в нем говорится:

Элементы приоритетной очереди упорядочиваются в соответствии с их естественным порядком или компаратором, предоставленным во время построения очереди, в зависимости от того, какой конструктор используется. Очередь с приоритетом не допускает пустых элементов. Очередь с приоритетом, основанная на естественном порядке, также не позволяет вставлять несопоставимые объекты (это может привести к исключению ClassCastException).

PriorityQueue ожидает объекты Comparator или Comparable. Пока один из них предоставлен, очередь будет «работать как надо», потому что она просто полагается на эти интерфейсы.

Если компаратор не указан, PriorityQueue попытается преобразовать элементы в Comparable, а затем использовать метод compareTo, чтобы определить, как их сортировать.

Когда предоставляется компаратор, PriorityQueue просто использует этот объект для сравнения элементов и сортировки их соответствующим образом.

Для дальнейшего чтения вы можете просмотреть учебники по Java, в частности урок об интерфейсах и наследовании.

person D.B.    schedule 24.10.2017