Michi: Ich check den Liste-Code von unserem Prof. nicht

Hallo Forum,
wir hatten im Unterricht ne Liste programmiert gehabt, wo man am Ende und am Anfang etwas einfügen kann.
An den Anfang einfügen ist mir klar, sobald man etwas an den Anfang anfügt, wird das vorherige Listenelement mitübergeben und in die Instanz "weiter" gespeichert.
Aber, das an das Ende einfügen, raffe ich überhaupt nicht.

Hier mal der Code von ListenElement:

  
public class ListenElement {  
	  
	private int daten;  
	private ListenElement weiter;  
	  
	public ListenElement(int daten) {  
		this.daten = daten;  
		this.weiter = null;  
	}  
	  
	public ListenElement(int daten, ListenElement weiter) {  
		this.daten = daten;  
		this.weiter = weiter;  
	}  
	  
	public void setDaten(int daten) {  
		this.daten = daten;  
	}  
	  
	public int getDaten() {  
		return daten;  
	}  
	  
	public void setWeiter(ListenElement weiter) {  
		this.weiter = weiter;  
	}  
	  
	public ListenElement getWeiter() {  
		return weiter;  
	}  
	  
	public String toString() {  
		return Integer.toString(daten);  
	}  
	  
}  

Und hier von der Liste, wo man an den Anfang und ans Ende etwas anhängen kann.

  
public class Liste {  
	  
	private ListenElement anfang;  
	private ListenElement ende;  
	  
	public Liste() {  
		anfang = null;  
		ende = null;  
	}  
	  
	public Liste(Liste l) {  
		  
	}  
	  
	public boolean equals(Liste l) {  
		return false;  
	}  
	  
	public boolean istLeer() {  
		return anfang == null;  
	}  
	  
	public String toString() {  
		if (istLeer()) return "<>";  
		  
		String ergebnis = "";  
		  
		for (ListenElement frosch = anfang; frosch != null;  
		     frosch = frosch.getWeiter())  
			ergebnis = ergebnis + frosch.getDaten() + " / ";  
		  
		return ergebnis.substring(0, ergebnis.length()-3);  
	}  
	  
	public void fuegeEinAmAnfang(int daten) {  
		anfang = new ListenElement(daten, anfang);  
		if (ende == null) ende = anfang;  
	}  
	  
	public void fuegeEinAmEnde(int daten) {  
		if (istLeer()) {  
			fuegeEinAmAnfang(daten);  
		} else {  
			ende.setWeiter(new ListenElement(daten));  
			ende = ende.getWeiter();  
		}  
	}  
	  
	public void loescheAmAnfang() {  
		if (istLeer()) return;  
		anfang = anfang.getWeiter();  
		if (anfang == null) ende = null;  
	}  
	  
	public void loescheAmEnde() {  
			}  
	  
	public int getElementAmAnfang() {  
		// Voraussetzung: Liste ist nichtleer  
		return anfang.getDaten();  
	}  
	  
	public int getElementAmEnde() {  
		// Voraussetzung: Liste ist nichtleer  
		return ende.getDaten();  
	}  
	  
	public int anzahlElemente() {  
		return 0;  
	}  
}  

Grüße

  1. echo $begrüßung;

    Aber, das an das Ende einfügen, raffe ich überhaupt nicht.

    Was konkret verstehst du nicht? Bringt dir das schrittweise Durchlaufen mit einem Debugger eventuell weitere Erkenntnisse?

    public void fuegeEinAmEnde(int daten) {
    if (istLeer()) {
    fuegeEinAmAnfang(daten);
    } else {
    ende.setWeiter(new ListenElement(daten));
    ende = ende.getWeiter();
    }
    }

    Wenn die Liste nicht leer ist, wird ein neues Element mit auf null gesetztem weiter erzeugt und als weiter des bisher letzten Element angefügt. Dann wird der Zeiger der Liste auf das letzte Element auf das neue Element gesetzt, das aber etwas eigenartig, weil vom jetzt vorletzten Element sein weiter abgefragt wird.

    Ich tät das ja so notieren:

    ListenElement element = new ListenElement(daten);
      ende.setWeiter(element);
      ende = element;

    echo "$verabschiedung $name";

    1. Hi,
      was mich gerade irritiert, dass 'ende' und 'anfang' ja zwei verschiedene Instanzvariablen von Liste sind.

      Ich tät das ja so notieren:

      ListenElement element = new ListenElement(daten);
        ende.setWeiter(element);
        ende = element;

      Die Instanzvariable 'ende' wird naher bei der Methode toString nichtmal ausgelesen. Evtl. habe ich etwas total verpeilt, ich muss mir den Code nochmal in Ruhe durchgehen und mit nem Beispiel auf Papier notieren.
      Das mit dem Debugger ist auch ne Idee, mal schauen, wie das in Netbeans funktioniert.

      Grüße

      1. echo $begrüßung;

        was mich gerade irritiert, dass 'ende' und 'anfang' ja zwei verschiedene Instanzvariablen von Liste sind.

        Was sollen sie sonst sein? Die eine zeigt auf das letzte Element, die andere auf das erste.

        Die Instanzvariable 'ende' wird naher bei der Methode toString nichtmal ausgelesen.

        Ja und? Sie ist zur Stringbildung ja auch nicht notwendig. Dort wird getestet, ob statt eines Nachfolgeelements ein null im weiter steht und daraufhin abgebrochen. Man könnte auch testen ob das aktuelle Element gleich ende entspricht, aber dann hätte man das ende-Element ausgeschlossen, weil schon beim Test die Schleife endet und deren Körper nicht mehr für ende ausgeführt wird. Man muss dessen Behandlung nachreichen, kann aber dabei das Trennzeichen weglassen und muss nicht nachträglich selbiges entfernen. In diesem einfachen Fall ist das sogar ein Vorteil. Wenn aber der Schleifenkörper umfangreicher ist, muss man diese Anweisungen ja auch noch mal für ende notieren, was zu doppeltem Code führt.

        Wenn du unbedingt das ende in toString haben willst, könntest du das so schreiben:

        public String toString() {
          if (istLeer())
            return "<>";

        String ergebnis = "";

        for (ListenElement frosch = anfang; frosch != ende; frosch = frosch.getWeiter())
            ergebnis += frosch.getDaten() + " / ";
          }
          ergebnis += ende.getDaten();

        return ergebnis;
        }

        Alternativ kann man die Schleife auch wie folgt notieren, dann hast du dein ende, das letzte Element wird innerhalb der Schleife behandelt und das Trennzeichenabschneiden entfällt ebenfalls.

        public String toString() {
          if (istLeer())
            return "<>";

        String ergebnis = "";

        for (ListenElement frosch = anfang; frosch != null; frosch = frosch.getWeiter())
            ergebnis += frosch.getDaten()
            if (frosch != ende)
              ergebnis += " / ";
          }

        return ergebnis;
        }

        ich muss mir den Code nochmal in Ruhe durchgehen und mit nem Beispiel auf Papier notieren.

        Das setzt voraus, dass deine Gedankengänge exakt so wie Java arbeiten und dass du dir alle Zwischenwerte notierst oder merkst. Das kann man machen, ist aber nur bei einfachen Abläufen empfehlenswert.

        Das mit dem Debugger ist auch ne Idee, mal schauen, wie das in Netbeans funktioniert.

        Um Abläufe zu verfolgen und dabei die Einzelwerte zu begutachten, dafür ist so ein Debugger erfunden worden. Lerne mit ihm umzugehen. Er ist ein unverzichtbares Hilfsmittel zur Fehlersuche.

        echo "$verabschiedung $name";