PriorityQueue (Prioritätswarteschlange)

Ab Java 1.5 gibt es die PriorityQueue im java.util Package und ist somit ein Teil des Java Collections Frameworks. Diese erweiterte Form einer Warteschlange ist ua. für diskreter Ereignissimulationen nützlich. Diese Klasse ist nicht synchronized.
Die PriorityQueue ist eine prioritätsorientierte Warteschlange, die stets das Element mit höchster Priorität zurückgibt (mit poll()).
Die Elemente sind nicht mehr gleichberechtigt wie bei der Standard-Warteschlange mit dem FIFO-Prinzip, sondern jedes Element besitzt sozusagen ein Rangabzeichen: je höher der Rang (Priorität), desto weiter vorne wird das Element in die Warteschlange eingereiht.
Es gibt einige Methoden die nicht in anderen Collections Interfaces zu finden sind: peek(), poll() und offer().

Nun ein einfaches Beispiel:


public class WarteSchlangenBeispiel {

enum Todo { AUFSTEHEN, ESSEN, ARBEITEN, TEE_KOCHEN };

static class InversSorter implements Comparator{

@Override
public int compare(Todo o1, Todo o2) {
return o2.ordinal() - o1.ordinal();
}
}

public static void main(String[] args) {

InversSorter sorter = new InversSorter();

PriorityQueue prioSchlange = new PriorityQueue(Todo.values().length, sorter);
// es gibt auch ein Konstruktor ohne Comparator z.B.
// PriorityQueue prioSchlange = new PriorityQueue();

for (Todo todo : Todo.values()) {
prioSchlange.offer(todo); // Schlange laden = prioSchlange.add(todo)
}

System.out.println("Anzahl Todos nach dem laden =" + prioSchlange.size());

System.out.println("Was hat die höchste priorität? " + prioSchlange.peek() + "n"); // mit prioSchlange.poll()
// würde das Objekt auch gelöscht werden

for (int i = 0; i < Todo.values().length; i++) { System.out.println(prioSchlange.poll());
}

System.out.println("Anzahl Todos=" + prioSchlange.size());
}
}

Also offer() ist das gleiche wie add() und fügt ein Objekt zu der Warteschlange hinzu.

Und peek() überträgt immer das Objekt mit der höchsten Priorität oder vom Kopf der Warteschlange ohne es zu löschen.

Im Gegensatz dazu poll() welches auch das Objekt mit der höchsten Priorität liefert aber das Element von der Warteschlange löscht.