2009-03-09 7 views
2

Javas PriorityQueue platziert das kleinste Element am Anfang der Liste, aber ich brauche es, um das größte Element am Kopf zu platzieren. Was ist der beste Weg, um eine Prioritätswarteschlange zu erhalten, die sich so verhält?In Java, was sollte ich für eine PriorityQueue verwenden, die zuerst das größte Element zurückgibt?

Da ich die Klasse in dieser Warteschlange geschrieben habe, konnte ich einfach die Ergebnisse von compareTo umkehren, es wird nicht außerhalb dieser Warteschlange verwendet.

Aber ich mag es, den Code eine genaue Darstellung dessen zu machen, was ich modelliere, was ich versuche zu tun, ist die größte zuerst, so dass der Code sollte sagen, dass mindestens zuerst mit einer ungewöhnlichen Definition von mindestens.

[bearbeiten] nur ein kurzes Dankeschön an alle, Komparator klingt wie, was ich brauche, sobald ich mir selbst beibringen, wie man einen schreibt.

Antwort

10

Übergeben Sie eine Comparator, die die natürliche Reihenfolge umkehrt, wenn Sie die PriorityQueue instanziieren.

Es würde wie folgt aussehen:

public class ReverseYourObjComparator implements Comparator<YourObj> { 
    public int compare(final YourObj arg0, final YourObj arg1) { 
     return 0 - arg0.compareTo(arg1); 
    } 
} 
+0

Dank, werde ich mich gehen beibringen, wie man das tun :) –

+1

Wenn Sie bereits einen Vergleicher haben, aber Sie wollen die umgekehrte Art, könnte man Finde Collections.reverseOrder() hilfreich. –

+0

Danke, aber ich habe es gerade fertig geschrieben, 0 - arg0.compareTo (arg1) ist ordentlicher als mein if, sonst wenn ich denke, dass ich das stattdessen benutze. –

2

Ich würde nur einen Komparator verwenden. Auf diese Weise wird die Sortierreihenfolge nur in Ihrer Warteschlange verwendet und nicht an Ihre Klasse angehängt.

2

Geben Sie einfach die PriorityQueue a Custom Comparator<? super E> durch den Konstruktor und ändern Sie die Reihenfolge der Elemente.

2

Von den javadocs:

PriorityQueue(int initialCapacity, Comparator<? super E> comparator) 
3

Sie haben grundsätzlich die Lösung direkt in Ihrer Frage: Sie haben einen Comparator an den Konstruktor eines PriorityQueue passieren kann. Der Komparator beeinflusst die Art und Weise, wie die Artikel bestellt werden.

0

Die API-Dokumentation zu PriorityQueue sagt: "Der Kopf dieser Warteschlange ist das kleinste Element in Bezug auf die angegebene Reihenfolge". Daher ist die Definition von "am wenigsten" subjektiv auf der Grundlage Ihrer spezifischen Reihenfolge, weshalb Sie die Möglichkeit haben, einen Komparator zur Verfügung zu stellen.

1

den Vergleicher Kommentare zu schreiben, finden Sie unter:

Collections.reverseOrder(); 
Verwandte Themen