Durchlaufen einer Queue

pmSave

Mitglied
Hallo, also um es kurz zu halten: ich weiß wie man eine Queue durchläuft... -dachte ich zumindest. Im Beispiel geht es darum, dass es eine Klassenvariable einer Queue die Objekte vom Typ Koordinate verwaltet gibt und ich von dieser Queue auf das letzte Objekt zugreifen möchte, dieses Stellt bei mir im Kontext die Position da. Jetzt habe ich das hier unten geschrieben, aber es ist leider so, dass die Klassenvariable der Queue nach einem Aufruf der Methode getPosition() auf null gesetzt wird. Ich verstehe das nicht, da ich doch eigentlich eine temporäre Variable benutze um mit der Queue zu arbeiten. Sieht vlt jemand mehr als ich oder hat eine alternative Lösung, um das letzte Objekt einer Queue zurückzugeben? Danke!

Java:
public Koordinate getPosition() { 
        Queue<Koordinate> tmp = this.getFullPosition();
        Koordinate k = tmp.front();
        while(!tmp.isEmpty()) {
            k = tmp.front();
            tmp.dequeue();
        }
        return k;
    }
 
Ich hatte eine Kopie von der aus dem Zentralabitur..

Java:
/**
 * <p>
 * Materialien zu den zentralen NRW-Abiturpruefungen im Fach Informatik ab 2018
 * </p>
 * <p>
 * Generische Klasse Queue<ContentType>
 * </p>
 * <p>
 * Objekte der generischen Klasse Queue (Warteschlange) verwalten beliebige
 * Objekte vom Typ ContentType nach dem First-In-First-Out-Prinzip, d.h., das
 * zuerst abgelegte Objekt wird als erstes wieder entnommen. Alle Methoden haben
 * eine konstante Laufzeit, unabhaengig von der Anzahl der verwalteten Objekte.
 * </p>
 * 
 * @author Qualitaets- und UnterstuetzungsAgentur - Landesinstitut fuer Schule
 * @version Generisch_02 2014-02-21
 */
public class Queue<ContentType> {
          
          /* --------- Anfang der privaten inneren Klasse -------------- */
          
          private class QueueNode {

                    private ContentType content = null;
                    private QueueNode nextNode = null;

                    /**
                     * Ein neues Objekt vom Typ QueueNode<ContentType> wird erschaffen. 
                     * Der Inhalt wird per Parameter gesetzt. Der Verweis ist leer.
                     * 
                     * @param pContent das Inhaltselement des Knotens vom Typ ContentType
                     */
                    public QueueNode(ContentType pContent) {
                              content = pContent;
                              nextNode = null;
                    }

                    /**
                     * Der Verweis wird auf das Objekt, das als Parameter uebergeben wird,
                     * gesetzt.
                     * 
                     * @param pNext der Nachfolger des Knotens
                     */
                    public void setNext(QueueNode pNext) {
                              nextNode = pNext;
                    }
                    
                    /**
                     * Liefert das naechste Element des aktuellen Knotens.
                     * 
                     * @return das Objekt vom Typ QueueNode, auf das der aktuelle Verweis zeigt
                     */
                    public QueueNode getNext() {
                              return nextNode;
                    }

                    /**
                     * Liefert das Inhaltsobjekt des Knotens vom Typ ContentType.
                     * 
                     * @return das Inhaltsobjekt des Knotens
                     */
                    public ContentType getContent() {
                              return content;
                    }
                    
          }
          
          /* ----------- Ende der privaten inneren Klasse -------------- */
          
          private QueueNode head;
          private QueueNode tail;

          /**
           * Eine leere Schlange wird erzeugt. 
           * Objekte, die in dieser Schlange verwaltet werden, muessen vom Typ
           * ContentType sein.
           */
          public Queue() {
                    head = null;
                    tail = null;
          }

          /**
           * Die Anfrage liefert den Wert true, wenn die Schlange keine Objekte enthaelt, 
           * sonst liefert sie den Wert false.
           * 
           * @return true, falls die Schlange leer ist, sonst false
           */
          public boolean isEmpty() {
                    return head == null;
          }

          /**
           * Das Objekt pContentType wird an die Schlange angehaengt. 
           * Falls pContentType gleich null ist, bleibt die Schlange unveraendert.
           * 
           * @param pContent
           *            das anzuhaengende Objekt vom Typ ContentType
           */
          public void enqueue(ContentType pContent) {
                    if (pContent != null) {
                              QueueNode newNode = new QueueNode(pContent);
                              if (this.isEmpty()) {
                                        head = newNode;
                                        tail = newNode;
                              } else {
                                        tail.setNext(newNode);
                                        tail = newNode;
                              }
                    }
          }

          /**
           * Das erste Objekt wird aus der Schlange entfernt. 
           * Falls die Schlange leer ist, wird sie nicht veraendert.
           */
          public void dequeue() {
                    if (!this.isEmpty()) {
                              head = head.getNext();
                              if (this.isEmpty()) {
                                        head = null;
                                        tail = null;
                              }
                    }
          }

          /**
           * Die Anfrage liefert das erste Objekt der Schlange. 
           * Die Schlange bleibt unveraendert. 
           * Falls die Schlange leer ist, wird null zurueckgegeben.
           *
           * @return das erste Objekt der Schlange vom Typ ContentType oder null,
           *         falls die Schlange leer ist
           */
          public ContentType front() {
                    if (this.isEmpty()) {
                              return null;
                    } else {
                              return head.getContent();
                    }
          }
}
 
Ich verstehe das nicht, da ich doch eigentlich eine temporäre Variable benutze um mit der Queue zu arbeiten.
Das ist recht einfach zu erklären: das Queue-Objekt existiert nur einmal, Deine Instanzvariable hält eine Referenz darauf und tmp ist dann die Kopie der Referenz.

Bei dieser Queue-Implementierung gibt es keine andere Möglichkeit, als die komplette Queue zu leeren, um an das letzte Element zu kommen. D. h. Du musst die Queue in eine temporäre Queue kopieren und anschließend wieder zurück in die ursprüngliche Queue schreiben.
 
Danke! Das heißt also ich müsste quasi die Queue Objekt nach Objekt in die temporäre übertragen z.B. mit einer weiteren while-Schleife(so habe ich das verstanden)
 
Aber theoretisch könnte ich doch wenn ich die temporäre habe den Verweis der Klassenvariablen-Queue auf die temporäre setzen oder nicht? Und damit noch etwas Arbeit sparen?
 

Zurück
Oben