PriorityQueue mit Objekten

Shizmo

Aktives Mitglied
Hallo ich würde gerne Objekte in eine Priority Queue geben und diese soll sie nach Werten des Objekts sortieren.

Also beispielsweise
Java:
Test x = new Test(12); 
Test y = new Test(5);

// x.getId(); <--- Diese Werte sollen verglichen werden

PriorityQueue <Test> queue = new PriorityQueue<>();
queue.offer(x);
queue.offer(y);

Ist sowas möglich?
 
So in der Richtung? Funktioniert leider nicht, also Objekte kann ich nun einfügen in die Queue, aber der Vergleich stimmt nicht (es wird nicht richtig sortiert).
Java:
public class Test implements Comparable<Test>{
        private int value;
       
        public Test(int value){
            this.value = value;
        }
       
        public int getValue(){
            return value;
        }

        @Override
        public int compareTo(Test o) {
            return Test.getValue();
        }
 
Java:
@Override
public int compareTo(Test o) {
       return Test.getValue();
}

Ist auch ein ziemlich Sinnloses vergleichen 😉
Es sollten schon irgendwie beide Werte verglichen werden, so ist der Vergleich mehr oder weniger zufällig (und widerspricht dem JavaDoc)

Zum Vergleichen von ints mal in Integer gucken 😉
 
Ich verstehs nicht.

Mit welchem Wert soll ich vergleichen? Mit der Instanzvariable value?
Warum Integer, wenn ich int habe?
 
Du musst in compare den aktuellen Test mit dem übergebenen Test vergleichen.
Was da verglichen wird, musst du überlegene, das kommt drauf an, welche natürliche Ordnung dein Test haben soll.
Bei diesen wird sinnvollerweise verglichen, indem value verglichen wird (da es die einzige Instanzvariable ist).

Integer stellt Methoden für ints bereit, ua um diese zu vergleichen.
 
Okay, also meinst du so:

Java:
@Override
        public int compareTo(tes o) {
            return Integer.valueOf(value).compareTo(Integer.valueOf(o.getValue()));
        }

Jetzt ist die Reihenfolge verändert, aber nicht so wie es sein soll.
Eingabe 5 - 8 -3
Ausgabe 3 - 8 - 5

Hmmm... 🙁
 
Kürzer wäre
Code:
@Override
        public int compareTo(Test that) {
            return Integer.compare(this.value,that.value);
        }

Zeig mal deinen Code, vllt liegt da woanders noch ein Fehler
 
Einmal Test-Klasse:
Java:
import java.util.*;

public class Test implements Comparable<Test>{
        private int value;
       
        public Test(int value){
            this.value = value;
        }
       
        public int getValue(){
            return value;
        }

        @Override
        public int compareTo(Test o) {
            return Integer.compare(this.value, o.getValue());
        }
       
        @Override
        public String toString(){
            return ""+value;
        }
    }

Und die Main zum Testen:
Java:
import java.util.*;

public class Main{
    
    public static void main(String[] args){
       
        Test x = new Test(5);
        Test y = new Test(8);
        Test z = new Test(3);
       

        PriorityQueue <Test> queue = new PriorityQueue<>();
       
        queue.offer(x);
        queue.offer(y);
        queue.offer(z);
              

        System.out.println(queue);
    }
}
 
Du musst auch #peek oder #poll benutzen, um das jeweils kleinste zu bekommen 😉

#toString berücksichtigt nicht die Sortierung
 

Neue Themen


Zurück
Oben