Kann ich eine Queue in Java durchsuchen/durchlaufen ohne sie zu leeren?

4 Antworten

Eine Queue bietet typischerweise die Operationen enqueue, dequeue und head (so auch in Java). Somit können Elemente hinten angefügt und vorne entfernt werden. Außerdem kann das vorderste Element betrachtet werden. Zum Durchsuchen müssen aber auch andere Elemente betrachtet werden. Hierzu ist also das Entfernen von Elementen erforderlich.

Ein einfacher Algorithmus entfernt das vorderste Element der Queue und fügt es einer anderen Queue hinzu. Dies wird wiederholt, bis die ursprüngliche Queue leer ist. Anschließend kann einfach die Referenz auf die alte Queue durch eine Referenz auf die neue ersetzt werden.

Sollte häufiges Suchen erforderlich sein, sollte besser eine geeignetere Datenstruktur verwendet werden.


Vorab, ich bin kein Javaianer, aber wenn ich das richtig sehe, dann kann ich über einen Iterator die queue durchlaufen.

ungefähr so:

Iterator<type> myitr= myqueue.iterator()
while(myitr.hasNext()){
     val=myitr.next()
}

Achtung bei concurrency.


regex9  26.09.2020, 02:49

Genau. Den expliziten Iterator kann man sich sogar sparen und gleich eine foreach-Schleife nutzen.

for (var item : queue) {
  // ...
}
0
KarlRanseierIII  26.09.2020, 02:58
@regex9

Wie sieht das bei Änderung aus? Beim expliziten iterator kann ich mit remove() das Element entfernen, klappt das auch bei der impliziten Variante, oder gibts da eine Exception?

0
regex9  26.09.2020, 03:05
@KarlRanseierIII

Das würde zu einem Ausnahmefall führen (ConcurrentModificationException).

1

Ich glaube nicht, eine Queue ist so definiert, dass das nicht geht. Du kannst aber die entnommen Objekte in einer neuen Queue aufreihen oder hinten wieder anstellen, da musst du nur ein Abbruchkriterium haben.

Nein, aber mit einem Deque geht das.

Woher ich das weiß:Berufserfahrung

KarlRanseierIII  26.09.2020, 01:36

Humm, laut Docs ererbt queue auch von java.util.Collection Iterator. müßte dann eine Iteration über die Queue nicht möglich sein?

0