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:
Konsolenoutput:
Tree Klasse, die die PriorityQueue erzeugt und befüllt, außerdem dem Comparator bereitstellt:
Hier noch die Node Klasse:
Wenn ich nicht komplett daneben liege, sollte der Konsolenoutput doch so aussehen:
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?
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");
}
}
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?