2017-12-02 1 views
2

Ich versuche, einen Stack in eine Methode zu überführen und dann einen doppelten Duplikatstapel zu erstellen und das Duplikat zu manipulieren, um zu sehen, ob es sortiert ist. Ich habe alles versucht, was mir einfällt, aber wenn ich den Stapel vor dem Ausführen meiner isSorted-Methode drucke, wird er wie erwartet gedruckt. Wenn ich die Methode isSorted ausführe und den übergebenen Stapel drucke, ist dieser leer.Wenn ich einen vom Benutzer erstellten Stack an eine Methode übergebe, wird der übergebene Stack geändert

Bitte beachten Sie die folgenden Code-Block:

public static boolean isSorted(Stack<RailwayCar> parkingArea) { 
     Stack<RailwayCar> tempStack = parkingArea; 
     boolean isSorted = true; 
     while (!tempStack.isEmpty()) { 
      int tempValue = tempStack.pop().getSerialNumber(); 
      if (!tempStack.isEmpty() && tempValue > tempStack.peek().getSerialNumber()) { 
       isSorted = false; 
      } 
     } 
     return isSorted; 
    } 
+0

Sie sind nicht eine temporäre Stapel zu schaffen. 'tempStack' und' parkingArea' zeigen auf das exakt gleiche Objekt, deshalb wird nach der Methode der ursprüngliche Stack geändert. Wenn Sie den Stapel kopieren möchten, müssen Sie jedes Element manuell in den neuen Stapel kopieren (oder verwenden Sie die Methode 'clone', die von' Vector' übernommen wurde). – BackSlash

Antwort

1

Sie kopieren nicht den Stapel, sondern einen anderen Zeiger auf den Stapel zu schaffen. TempStack und ParkingArea zeigen beide auf das gleiche Objekt. Verwenden Sie zum Erstellen einer Kopie die .clone() -Methode.

Stack<RailwayCar> tempStack = parkingArea.clone(); 

EDIT: Wenn Sie die Klon-Methode selbst, seine ziemlich einfach zu tun mit Hilfe eines dritten Stapel zu implementieren. Nach dem Vorbild des folgenden Pseudo-Code:

clone(): 
    copy = new Stack; 
    helper = new Stack; 
    while not this.is_empty(): 
     helper.put(this.pop()); 
    while not helper.is_empty(): 
     item = helper.pop(); 
     copy.put(item); 
     this.put(item); 
    return copy; 

Wir Umkehren des Stapels und Klonen jedes Elemente beim Rückwärts zurück.

Beachten Sie, dass dadurch eine flache Kopie erstellt wird. Wie in, zeigt die Kopie auf die gleichen Elemente. Um eine tiefere Kopie zu erhalten, werden Sie item.clone implementieren müssen und rufen Sie die folgende:

copy.put(item.clone()) 

statt

copy.put(item) 
+0

Ich verwende eine Stack-Klasse, die ich nicht erstellt habe, Java in Stack. Was wäre der richtige Weg, dies zu tun, ohne Warnungen zu erhalten? Wenn ich versuche, eine Methode in meiner Stack-Klasse zum Kopieren zu erstellen, laufe ich auf das Sam-Problem, wenn ich versuche, alle Knoten im Stack, die ich kopieren möchte, hinzuzufügen. –

+0

@MrBigglesworth Ich habe eine Pseudocode-Erklärung hinzugefügt, wie man einen Stack klonen kann. In Ihrem Fall müssen Sie möglicherweise auch RailwayCar.clone implementieren. –

+0

Danke, ich habe tatsächlich etwas sehr nah dran getan. Ich habe einen weiteren Stapel erstellt und alles hineingeschoben und dann zurück in den ursprünglichen Stapel geschoben, um zu prüfen, ob es sortiert ist. Ich verstehe jetzt, warum es die ParkingArea änderte, die ich nicht völlig verstanden habe, dass es ein Referenzzeiger ist, aber nach einigem Lesen bekomme ich es (oder zumindest genug, um zu verstehen, was vor sich ging). Nochmals vielen Dank für Ihre Hilfe Ich schätze es sehr und hoffe, Sie haben einen schönen Nachmittag. –

Verwandte Themen