Priority Queue

Pauli85

Mitglied
Hallo,
ich soll eine Klasse schreiben, die eine Priority Queue darstellt. Diese soll das Interface Queue implementieren und zwei Konstruktoren haben, einen ohne Parameterliste, der die Elemente in natürlicher Reihenfolge abspeichert, und einen der einen Comparator übergeben bekommt. Außerdem sollen die Elemente in einer ArrayList gespeichert werden.
So weit so gut. Ich habe aber momentan noch das Problem, dass ich nicht weiß wie ich die Prioritäten speichern soll. Das Element mit der höchten Priorität kommt ja ganz nach vorne. Wenn ich jetzt ein Element hinzufüge, brauche ich ja nur zu prüfen, ob die Priorität höher als das erste Element ist oder nicht und es dann ggf. als erstes Element hinzufügen. So habe ich immer das Element mit der höchsten Priorität ganz vorne. Aber was ist, wenn das erste Element gelöscht wird? Woher weiß ich dann ohne die ganze Liste durchzugehen, welches das Element mit der zweit höchsten Priorität ist?
Ich bräuchte also eine Idee um die Prioritäten zu verwalten.

Vielen Dank & Grüße
 

HimBromBeere

Top Contributor
Du musst doch sowieso durch jedes Element der Liste durchgehen, um sie neu zu priorisieren. Dann machste das in einem Aufwasch.

Noch einfacher wär´s natürlich, wenn du die Priorität einfach als Index einer Liste verwendest. Dann löschst du z.B. einfach das Element der Priorität 1 (also Index 1), der Rest "rutscht doch sowieso nach" (sprich Index 1 ist jetzt das, was vorher Index 2 war usw.).

Kenne mich mit Queues nicht wirklich aus, kann sein, dass es da auch bessere Methoden für gibt.
 

X5-599

Top Contributor
Nebenbei, ist das Queue Interface das java.util.Queue Interface? Oder etwas eigenes?
Ist hier wohl aber egal...

Da du was von Comparator geschrieben hast, könnte man doch einfach einen schreiben der die Priorität aus den Objekten liest und verarbeitet.

Java:
public class MyObject
{
  private int priority;
  public int getPriority()
  {
    return priority;
  }
}

In deiner Queue Klasse dann eine add(MyObject m) Methode die einfach das Objekt in eine ArrayList packt (simples add()) und danach per Arrays.sort(arrayListe.toArray(), myObjectComparator) die Liste sortiert.

Habs jetzt nicht getestet und auch nur gerade aus dem Kopf so hingeschrieben. ;) Vermutlich bekommt man bei "arrayListe.toArray()" noch Ärger weil nen Object[] zurückkommt und kein MyObject[]... Wie gesagt: Nicht getestet.
 

Pauli85

Mitglied
Du musst doch sowieso durch jedes Element der Liste durchgehen, um sie neu zu priorisieren. Dann machste das in einem Aufwasch.

Also ich hab das so verstanden, dass der Vorteil der Queue der ist, dass man nicht jedes Element iterativ durchgehen muss und sich so Zeitaufwand spart. Deshalb sind die Elemente in der Liste auch nicht sortiert. Ich habe hier ein Beispiel aus "Java ist auch eine Insel":
Java:
PriorityQueue<Integer> queue = new PriorityQueue<Integer>();
queue.addAll( Arrays.asList( 9, 2, 3, 1, 3, 8 ) );
System.out.println( queue );  // [1, 2, 3, 9, 3, 8]
queue.remove();
System.out.println( queue );  // [2, 3, 3, 9, 8]
queue.remove();
System.out.println( queue );  // [3, 8, 3, 9]
queue.remove();
System.out.println( queue );  // [3, 8, 9]
queue.remove();
System.out.println( queue );  // [8, 9]
queue.remove();
System.out.println( queue );  // [9]
queue.remove();
System.out.println( queue );  // []
Dort ist die Liste ja auch nicht sortiert, trotzdem steht jedesmal das Element mit der höchten Priorität ganz vorne. Und wie ich darauf komme weiß ich nicht.
Das mit dem Comparator im Konstruktor war so gemeint, dass der Defaultkonstruktor verwendet wird, falls es sich um Typen handelt die comparable sind, und falls Typen verwendet werden die nicht comparable sind (z.B. eigene Typen/Klassen) muss man einen Comparator mitübergeben.

Grüße
 

X5-599

Top Contributor
Also entweder in deiner Objekt Klasse das Comparable Interface imlementieren oder einen Comparator schreiben der mit deiner Objekt Klasse umgehen kann.

Ist dein Problem jetzt die Implementierung des Comparable Interfaces bzw. des Comparators?
 

Joew0815

Bekanntes Mitglied
Ich wurde mir die einzelnen Prioritäten als Enum definieren:
Java:
enum Priority
{
	ECHTZEIT,
	SEHR_HOCH,
	HOCH,
	NORMAL,
	NIEDRIG,
	SEHR_NIEDRIG,
	LEERLAUF
}

Die Queue hat leider nur eine [add] Funktion mit einem Parameter:
Java:
public class QueueItem
{
	private final Priority prio;
	private final Object item;

	public QueueItem(Priority prio, Object item)
	{
		super();
		this.prio = prio;
		this.item = item;
	}

	public Priority getPrio()
	{
		return prio;
	}

	public Object getItem()
	{
		return item;
	}
}

Und dann die Objekte in eine Map legen:
Java:
// java.util.Map
// java.util.HashMap
private final Map<Priority, List<QueueItem>> items = new HashMap<Priority, List<QueueItem>>();

Java:
	public void add(final QueueItem item)
	{
		// Hier wurde schon fuer jede Prio eine List i Konstruktor erstellt
		final List<QueueItem> temp = this.item.get(item.getPrio());
		temp.add(item);
	}
	
	public void add(final QueueItem item)
	{
		// Hier wird die Liste fuer die Prio erstellt, wenn sie gebaucht wird
		List<QueueItem> temp = this.items.get(item.getPrio());
		if(temp == null)
		{
			temp = new ArrayList<QueueItem>();
			this.items.put(item.getPrio(), temp);
		}
		temp.add(item);
	}

Vorteil:
Ich kann mir alle Objekte mit einer bestimmten Priorität Ausgeben
Ich muss nicht bei jedem add sortieren
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Priority Queue Performance Java Basics - Anfänger-Themen 3
A Priority Queue / Comparator Java Basics - Anfänger-Themen 6
T Priority-Queue Java Basics - Anfänger-Themen 9
K Priority Queue - wo ist denn jetzt der Vorteil? Java Basics - Anfänger-Themen 7
M Queue-Datenstruktur: nach dem Elementen entfernen, das Ergebnis ist immer noch nicht optimal. Java Basics - Anfänger-Themen 3
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
N Vererbung Queue bestehend aus Superclass- und Subclass-Objekten Java Basics - Anfänger-Themen 7
B Zahlenfolge von Queue in Stack Java Basics - Anfänger-Themen 29
J Java Queue mit default Werten erstellen Java Basics - Anfänger-Themen 4
Chabub Hilfe bei Stacks und Queue Java Basics - Anfänger-Themen 2
G Stack und Queue Arbeitsblatt Java Basics - Anfänger-Themen 3
F Queue zyklisch Java Basics - Anfänger-Themen 8
D Queue vs. Stack Java Basics - Anfänger-Themen 6
L Queue mithilfe von 2 Stacks erstellen Java Basics - Anfänger-Themen 1
B Automatisierung von Jobs / @EJB Scheduler / Verhinderung, dass Queue überläuft Java Basics - Anfänger-Themen 2
J Queue Warteschlange Java Basics - Anfänger-Themen 3
J Liste,Queue,Stack sortieren Java Basics - Anfänger-Themen 2
Y Unendlicher Ringbuffer (Queue) Java Basics - Anfänger-Themen 49
C Stack und Queue in Aktion (Bitte Hilfe für die Klausur) Java Basics - Anfänger-Themen 7
E Stack vs Queue - Gemeinsamkeiten / Unterschiede Java Basics - Anfänger-Themen 7
H Collections StackOverflowError in einer Queue Java Basics - Anfänger-Themen 3
R Klassen Die lineare Datenstruktur Queue Java Basics - Anfänger-Themen 3
JokerBlacky Klassen Klasse Queue Klasse mit Attributen anhängen und auslesen können Java Basics - Anfänger-Themen 4
K Queue enq Fehler Java Basics - Anfänger-Themen 2
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
A Queue (Array) leeren Java Basics - Anfänger-Themen 1
F HTTP Get Queue Java Basics - Anfänger-Themen 7
J Queue zyklisch auslesen Java Basics - Anfänger-Themen 4
B Generische Queue programmieren Java Basics - Anfänger-Themen 5
S Integer/Value-Paar in Prio-Queue ohne Comparator Java Basics - Anfänger-Themen 5
P Array queue problem Java Basics - Anfänger-Themen 1
L Queue programmieren via BlueJ Java Basics - Anfänger-Themen 5
B Multithreading und eigene Queue entwickeln Java Basics - Anfänger-Themen 3
I Erste Schritte Queue Java Basics - Anfänger-Themen 14
G Queue auf einer Seite löschen, andre Seite schreiben Java Basics - Anfänger-Themen 3
G Queue mit int oder float Java Basics - Anfänger-Themen 3
Q queue.remove Element trotzdem noch vorhanden. Java Basics - Anfänger-Themen 10
M Compiler-Fehler Queue als ArrayList mit Exceptions Java Basics - Anfänger-Themen 3
S Fehler beim Auslösen des ActionListeners in Verbindung mit einer Queue Java Basics - Anfänger-Themen 5
B Queue mit Daten aus einem Stack füllen Java Basics - Anfänger-Themen 21
P Collections Queue mittels ArrayList Java Basics - Anfänger-Themen 2
T Collections Queue<? extends Number> add() offer() Java Basics - Anfänger-Themen 13
S Queue als doppelt verkettete Liste Java Basics - Anfänger-Themen 2
R NullPointerException in Queue-Implementierung Java Basics - Anfänger-Themen 11
B Queue problem! Java Basics - Anfänger-Themen 2
R Queue abhören und Message in Browser ausgeben Java Basics - Anfänger-Themen 3
T Erstellung von Queue mit verkketten listen Java Basics - Anfänger-Themen 3
kulturfenster Stack / Queue Implementationen Java Basics - Anfänger-Themen 11
W Iterator in Queue Java Basics - Anfänger-Themen 5
Q An erste Stelle in eine Queue eintragen Java Basics - Anfänger-Themen 4
H Stack und Queue Java Basics - Anfänger-Themen 6
M Threadsichere Queue in Java 1.5? Java Basics - Anfänger-Themen 2
G Int-Queue in String-Queue umwandeln Java Basics - Anfänger-Themen 5
A Queue erweitern Java Basics - Anfänger-Themen 13
P Queue, Stacks, Listen Java Basics - Anfänger-Themen 7
S Queue als Array implementiert get()? Java Basics - Anfänger-Themen 4
S Queue als verkettete Liste Java Basics - Anfänger-Themen 9
S Queue Java Basics - Anfänger-Themen 30
K Prüfen, ob Queue leer ist Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben