package javacodebook.collections.priorityqueue;

import java.util.*;

/**
 * Eine Prioritätswarteschlange als Erweiterung der einfachen Warteschlange.
 */
public class PriorityQueue extends javacodebook.collections.queue.Queue {

    /** Erzeugt eine neue Prioritätswarteschlange mit variabler Größe */
    public PriorityQueue() {
        super();
    }

    /** Fügt ein Objekt ein, dass sich selbst mit den bereits vorhandenen
     * Objekten vergleichen kann. Hierbei wird eine Verschärfung der Methode in
     * der Oberklasse Queue vorgenommen, das eingefügte Objekt muss das
     * Interface java.lang.Comparable implementieren.
     **/
    public void insert(Comparable obj) {
        insert(obj, null);
    }

    /** Fügt ein Objekt ein, dass sich nicht selbst mit den bereits vorhandenen
     * Objekten vergleichen kann. Statt dessen wird ein Vergleichs-Operator in
     * Form eines Comparator-Objekts erwartet, das den Vergleich durchführt.
     **/
    public void insert(Object obj, Comparator comp) {
        int index = Collections.binarySearch(super.queue, obj);
        if(index < 0)
            super.queue.add(-index -1, obj);
        else
            super.queue.addLast(obj);
    }

}
