Datentypen PriorityQueue sortiert falsch?

_dp

Mitglied
Hi

Ich möchte mir eine PriorityQueue erstellen, die ich mit elementen fülle und die mir dann mittels eigenem Comparator die Elemente in Aufsteigender Reihenfolge eines bestimmten Attributs zurückgibt.

Leider hab ich damit Probleme, ich bin mir zwar sicher alles richtig gemacht zu haben, dennoch stimmt die Anordnung der Testelemente nicht.

Hier die Testklasse:
Java:
public class HuffmanTreeTests {

	static HuffmanTree<String> uut;
	
	@Before
	public void setUp() throws Exception {
		uut = new HuffmanTree<String>();
	}

	@Test
	public void testCreateQueue() {
		uut.add("888", 12);
		uut.add("112", 2);
		uut.add("111", 1);
		uut.add("434", 4);
		
		Collection<HuffmanTreeNode<String>> queue = uut.getQueue();
		System.out.println("====== Dumping priority queue");
		for (HuffmanTreeNode<String> s : queue) {
			System.out.println(s.getPayload());
		}
		System.out.println("====== Dump end");
		
	}

}
Konsolenoutput:
Code:
Comparing 2 vs. 12, returning -1
Comparing 1 vs. 2, returning -1
Comparing 4 vs. 12, returning -1
Comparing 4 vs. 1, returning 1
====== Dumping priority queue
111
434
112
888
====== Dump end

Tree Klasse, die die PriorityQueue erzeugt und befüllt, außerdem dem Comparator bereitstellt:
Java:
public class HuffmanTree<E> {
	
	HuffmanTreeNode<E> root;
	
	HuffmanTreeNode<E> current;
	
	PriorityBlockingQueue<HuffmanTreeNode<E>> queue;
	
	public HuffmanTree() {
		queue = new PriorityBlockingQueue<HuffmanTreeNode<E>>(43, new Comparator<HuffmanTreeNode<?>>() {
			@Override
			public int compare(HuffmanTreeNode<?> o1, HuffmanTreeNode<?> o2) {
				int ret;
				if (o1.getWeight() == o2.getWeight()) ret = 0;
				if (o1.getWeight() > o2.getWeight()) ret = 1;
				else ret = -1;
				System.out.println("Comparing "+o1.getWeight()+" vs. "+o2.getWeight()+", returning "+ret);
				return ret;
			}
		});
	}
	
	public void add(E payload, Integer weight) {
		HuffmanTreeNode<E> node = new HuffmanTreeNode<E>(payload, weight);
		queue.add(node);
	}
	
	public PriorityBlockingQueue<HuffmanTreeNode<E>> getQueue() {
		return queue;
	}
}

Hier noch die Node Klasse:
Java:
public class HuffmanTreeNode<E> {

	private E payload;
	
	private int weight;
	
	private HuffmanTreeNode<E> left;
	
	private HuffmanTreeNode<E> right;

	private HuffmanTreeNode<E> parent;

	public HuffmanTreeNode(E payload, int weight) {
		this.payload = payload;
		this.weight = weight;
	}

	public int getWeight() {
		return weight;
	}
}

Wenn ich nicht komplett daneben liege, sollte der Konsolenoutput doch so aussehen:
Code:
111
112
434
888

Und ich meine auch, dass das 3. einzufügende Element nicht nur gegen das 2. sondern auch das 1. Testelement verglichen werden sollte, oder?

Die PriorityBlockingQueue war vorher auch mal eine normale PriorityQueue, aber das gab mir kein positiveres Ergebnis leider.

Wo ist der Fehler?
 
S

SlaterB

Gast
die Queue hat nicht zu jedem Zeitpunkt eine vollständige Sortierung, sondern legt besonders darauf wert, dass das erste Element richtig ist,
alle werden übrigens in Baumdarstellung gespeichert

111
112
434
888
bedeutet dass 111 die Wurzel ist, 112 der linke Nachfolger mit unten noch 888 dran, 434 der rechte Nachfolger,

der normale Iterator geht das Array dieser Baumdarstellung ab, sorgt sich nicht um Reihenfolge
The Iterator provided in method iterator() is not guaranteed to traverse the elements of the PriorityQueue in any particular order. If you need ordered traversal, consider using Arrays.sort(pq.toArray()).
PriorityQueue (Java 2 Platform SE 5.0)

wenn du 4x poll() aufrufst, dann kommen die Elemente in richtiger Reihenfolge und dann gibts auch weitere Compare-Aufrufe

noch ein Link:
Descending Priority Heap (2008)
 
Zuletzt bearbeitet von einem Moderator:

Marco13

Top Contributor
Ansonsten, mal drübergeschaut:

Code:
if (o1.getWeight() == o2.getWeight()) ret = 0;
if (o1.getWeight() > o2.getWeight()) ret = 1;
else ret = -1;
Ich weiß nicht genau, wann da was womit verglichen wird, aber überleg' mal genau, welchen Wert 'ret' dort bekommt, wenn das erste Gewicht NICHT größer als das zweite (sondern NUR gleich!!!) ist...
 

_dp

Mitglied
die Queue hat nicht zu jedem Zeitpunkt eine vollständige Sortierung, sondern legt besonders darauf wert, dass das erste Element richtig ist,
Danke, dieses Detail war mir nicht bekannt.

Ansonsten, mal drübergeschaut:

Code:
if (o1.getWeight() == o2.getWeight()) ret = 0;
if (o1.getWeight() > o2.getWeight()) ret = 1;
else ret = -1;
Ich weiß nicht genau, wann da was womit verglichen wird, aber überleg' mal genau, welchen Wert 'ret' dort bekommt, wenn das erste Gewicht NICHT größer als das zweite (sondern NUR gleich!!!) ist...

Danke für den Hinweis, hab ich so garnicht bemerkt.
Vorher waren dort "return" statements statt der zwischenvariable, bevor ich dann die Debug Ausgabe hinzugefügt hatte. das >= kommt aber im Grunde aufs Selbe hinaus da in meinem Falle eh kein Key doppelt vor kommt. Danke trotzdem!
 

Crian

Top Contributor
Wenn du aus dem > ein >= machst, wirst du nie eine 0 als Ergebnis bekommen. Wie wäre es mit [c]return o1.getWeight() - o2.getWeight();[/c] ?
 

Marco13

Top Contributor
das >= kommt aber im Grunde aufs Selbe hinaus da in meinem Falle eh kein Key doppelt vor kommt. Danke trotzdem!


Dass kein Key doppelt vorkommt heißt (bei einer Priority Queue vielleicht(!) schon, aber evtl. auch nicht, und ) im allgemeinen sicher nicht, dass nicht mal ein Key mit sich selbst verglichen wird - und dann sollte er definitv NICHT sagen, dass er "größer ist als er selbst"!

Der Vorschlag von Crian löst das Problem. (Ich hatte irgendwie gedacht die "weights" wären double, da geht das nicht, aber bei int kann man das so machen)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Wertepaar in LinkedList/PriorityQueue speichern Allgemeine Java-Themen 3
K PriorityQueue mit Gewicht Allgemeine Java-Themen 3
D PriorityQueue selbst implementieren Allgemeine Java-Themen 15
B OOP HashSet sortiert ausgeben Allgemeine Java-Themen 11
G Datentypen TreeMap nach Color sortiert (kd-Baum) Allgemeine Java-Themen 8
P Datentypen Große Datenmenge Sortiert halten Allgemeine Java-Themen 12
G File.listFiles nach Datum sortiert ausgeben Allgemeine Java-Themen 1
F (Wie) sortiert ihr eure Felder, Methoden, etc? Allgemeine Java-Themen 19
L Binärbaum sortiert ausgeben Allgemeine Java-Themen 11
M HashMap sortiert Allgemeine Java-Themen 6
T HashMap, sortiert nach Reihenfolge Allgemeine Java-Themen 7
m@nu FileTreeModel sortiert . uiuiui Allgemeine Java-Themen 14
E HashMap/Table sortiert nach nacheinander eingefuegten Elmeme Allgemeine Java-Themen 6
T Verschachtelte For-Schleife gibt falschen Wert zurück, Abbruchbedingung evtl. falsch? Allgemeine Java-Themen 9
berserkerdq2 Kann keine Labels erstellen, was ist hier syntaktisch falsch Allgemeine Java-Themen 5
A was habe ich Falsch gemacht ? Allgemeine Java-Themen 5
SaschaMeyer Arbeitet String.split falsch? Allgemeine Java-Themen 4
Y Warum wird das JLabel falsch verschoben? Allgemeine Java-Themen 1
Elyt Compiler-Fehler Datei kann nicht erstellt werden. Die Syntax für den Dateinamen etc. ist falsch. Allgemeine Java-Themen 2
K Vorzeichen falsch Allgemeine Java-Themen 2
R JDK installieren OpenJDK druckt falsch Allgemeine Java-Themen 3
R Verschlüsselung falsch Allgemeine Java-Themen 3
@SupressWarnings() Multilanguaging lädt immer falsch Allgemeine Java-Themen 5
T Umlaute werden falsch gedruckt Allgemeine Java-Themen 2
B public class JarFilter extends FileFilter « Falsch? Allgemeine Java-Themen 4
M Google Guice (Assisted Injects) - Buggy oder mach ich's falsch? Allgemeine Java-Themen 5
O Socket Object wird scheinbar falsch empfangen Allgemeine Java-Themen 6
T Ausgabe falsch! Allgemeine Java-Themen 5
M Nach Programmdurchlauf werden Zeichen falsch dargestellt + Anderes Verhalten unter Windows Allgemeine Java-Themen 6
R Was ist hier falsch? Abfragen Allgemeine Java-Themen 3
D Zufall wahr bzw. falsch mit zwei Faktoren Allgemeine Java-Themen 10
N BigDecimal falsch formatiert bei Locale.GERMANY Allgemeine Java-Themen 3
I For- Schleife falsch? Allgemeine Java-Themen 8
Developer_X Graphic was falsch? Allgemeine Java-Themen 6
T Wurfweitenberechnung: X-Werte bei extremen Werten falsch. Allgemeine Java-Themen 15
R Sting.split() was mache ich falsch? Allgemeine Java-Themen 5
T NetBeans: Ist meine Konfiguration falsch? Allgemeine Java-Themen 7
M Java rechnet falsch? Allgemeine Java-Themen 22
N MathContext rundet falsch? Allgemeine Java-Themen 1
U if Abfrage macht etwas falsch Allgemeine Java-Themen 2
T Pipe-Funktion - Prozente falsch? Allgemeine Java-Themen 8
R Prozente falsch errechnet? Allgemeine Java-Themen 27
TheJavaKid *GGRRR* was mach ich falsch >:( Allgemeine Java-Themen 3
P Was ist denn Bitte falsch? Allgemeine Java-Themen 2
S Was ist hier falsch? Allgemeine Java-Themen 16
M Systemzeit der Java VM geht falsch Allgemeine Java-Themen 4
T Hilfe! Was ist falsch? Allgemeine Java-Themen 7
M Zugriffsberechtigung unter Windows 2000 falsch? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben