Liste erstellt und ein Problem mit dem Index

sserio

Bekanntes Mitglied
Sehr geehrte Community,
ich habe mich zum ersten Mal daran gewagt eine eigene Liste zu programmieren. Grundsätzlich verstehe ich die Gedanken dahinter, aber nicht genau wie ich es implementieren soll. In meinem Code habe ich eine insert Methode hinzugefügt und eine find variable beim Index. Gebe ich beim insert 9 ein und suche nach dem index 0 und 1 so gibt er für beide value 9 aus. Bei index 2 findet er dann nichts, weil es null ist (was auch gut ist). Benutze ich die insert methode dann ein zweites Mal, so ist die 9 dann beim idex 0 und die neue Zahl beim index 1. Wieso war die 9 dann davor beim index 0 und 1, die Liste ist dann ja eigentlich nicht brauchbar.

package list;

public class MyList {
ListElement start;

public MyList() {
start = new ListElement(9);
}

public void insertLast(int value) {
ListElement newElement = new ListElement(value);
start.next = newElement;
}

public double get(int index) {
return findIndex(index).getValue();
}


private ListElement findIndex(int index) {
ListElement iterator = start;
for (int i = 0; i < index; i++) {
if (iterator.hasNext()) {
iterator = iterator.next;
} else {
return null;
}
}
return iterator;
}

}

package list;

public class ListElement {
double value;
ListElement next;

public ListElement(double value) {
this.value = value;
next = null;
}

public double getValue() {
return value;
}
public boolean hasNext() {
if (this.next == null) {
return false;
} else {
return true;
}
}
}

package list;

public class Main {
public static void main(String[] args) {
MyList myList = new MyList();
myList.insertLast(9);
System.out.println(myList.get(0));
System.out.println(myList.get(1));
System.out.println("--------------------------------");
myList.insertLast(3);
System.out.println(myList.get(0));
System.out.println(myList.get(1));
}

}
 
Mal in schön:
Java:
package list;

public class MyList {
    ListElement start;

    public MyList() {
        start = new ListElement(9);
    }

    public void insertLast(int value) {
        ListElement newElement = new ListElement(value);
        start.next = newElement;
    }

    public double get(int index) {
        return findIndex(index).getValue();
    }


    private ListElement findIndex(int index) {
        ListElement iterator = start;
        for (int i = 0; i < index; i++) {
            if (iterator.hasNext()) {
                iterator = iterator.next;
            } else {
                return null;
            }
        }
        return iterator;
    }
}

Java:
package list;

public class ListElement {
    double value;
    ListElement next;

    public ListElement(double value) {
        this.value = value;
        next = null;
    }

    public double getValue() {
        return value;
    }

    public boolean hasNext() {
        if (this.next == null) {
            return false;
        } else {
            return true;
        }
    }
}

Java:
package list;

public class Main {
    public static void main(String[] args) {
        MyList myList = new MyList();
        myList.insertLast(9);
        System.out.println(myList.get(0));
        System.out.println(myList.get(1));
        System.out.println("--------------------------------");
        myList.insertLast(3);
        System.out.println(myList.get(0));
        System.out.println(myList.get(1));
    }
}

Deine insertLast-Methode fügt nach dem Start-Element ein. Das liefert beim ersten Mal noch das korrekte Ergebnis, weil zu diesem Zeitpunkt das Start-Element das letzte Element ist. Danach gilt das nicht mehr.

Du willst nicht nach dem Start-Element sondern nach dem letzten Element einfügen.
 
Mal in schön:
Java:
package list;

public class MyList {
    ListElement start;

    public MyList() {
        start = new ListElement(9);
    }

    public void insertLast(int value) {
        ListElement newElement = new ListElement(value);
        start.next = newElement;
    }

    public double get(int index) {
        return findIndex(index).getValue();
    }


    private ListElement findIndex(int index) {
        ListElement iterator = start;
        for (int i = 0; i < index; i++) {
            if (iterator.hasNext()) {
                iterator = iterator.next;
            } else {
                return null;
            }
        }
        return iterator;
    }
}

Java:
package list;

public class ListElement {
    double value;
    ListElement next;

    public ListElement(double value) {
        this.value = value;
        next = null;
    }

    public double getValue() {
        return value;
    }

    public boolean hasNext() {
        if (this.next == null) {
            return false;
        } else {
            return true;
        }
    }
}

Java:
package list;

public class Main {
    public static void main(String[] args) {
        MyList myList = new MyList();
        myList.insertLast(9);
        System.out.println(myList.get(0));
        System.out.println(myList.get(1));
        System.out.println("--------------------------------");
        myList.insertLast(3);
        System.out.println(myList.get(0));
        System.out.println(myList.get(1));
    }
}

Deine insertLast-Methode fügt nach dem Start-Element ein. Das liefert beim ersten Mal noch das korrekte Ergebnis, weil zu diesem Zeitpunkt das Start-Element das letzte Element ist. Danach gilt das nicht mehr.

Du willst nicht nach dem Start-Element sondern nach dem letzten Element einfügen.
Wie mache ich das? Ich muss dann ja nochmal ein Element erzeugen oder wie
 
Um sich das besser vorstellen zu können, kannst Du ja mal an einen Zug denken.

Aufgabe: hänge einen Waggon ans Ende des Zugs an.

Dein Code schnappt sich nun den ersten Waggon und hängt an diesen den einzufügenden Waggon an.
 
Aber der erste wagon ist null. Wenn ich dann etwas dranhängen möchte wird null irgendwie zu diesem element und der wagon dahinter auch.

/code public void insertLast(int value) {
if (start==null){
start = new ListElement(value);
} else {
ListElement newElement = new ListElement(value);
start.next = newElement;
}
}
Ich habe mir das irgendwie so gedacht, dass wenn der wagon 0 ist soll er ersetzt werden. Aber wenn der wagon nicht null ist soll er ans ende gehangen werden. Klappt aber nicht
 
Aber der erste wagon ist null. Wenn ich dann etwas dranhängen möchte wird null irgendwie zu diesem element und der wagon dahinter auch.

/code public void insertLast(int value) {
if (start==null){
start = new ListElement(value);
} else {
ListElement newElement = new ListElement(value);
start.next = newElement;
}
}
Ich habe mir das irgendwie so gedacht, dass wenn der wagon 0 ist soll er ersetzt werden. Aber wenn der wagon nicht null ist soll er ans ende gehangen werden. Klappt aber nicht
Damit Start nicht verändert wird könnte man theoretisch noch eine temporäre einbauen. Klappt dennoch nicht
 
Um sich das besser vorstellen zu können, kannst Du ja mal an einen Zug denken.

Aufgabe: hänge einen Waggon ans Ende des Zugs an.

Dein Code schnappt sich nun den ersten Waggon und hängt an diesen den einzufügenden Waggon an.
package list;


import java.util.Objects;

public class MyList {
ListElement start;

public MyList() {
start = new ListElement(Math.PI); //start braucht einen Wert
}


public void insertLast(int value) {
if (start.getValue() == Math.PI) { //wenn dieser wert zutrifft, dann soll start erstmal einen wert bekommen bei index0 und mit den nächsten insert methoden wird index 1,2,3, benutzt
start = new ListElement(value);
} else {
ListElement newElement = new ListElement(value);
start.next = newElement;
}
}


public double get(int index) {
return Objects.requireNonNull(findIndex(index)).getValue();
}


private ListElement findIndex(int index) {
ListElement iterator = start;
for (int i = 0; i < index; i++) {
if (iterator.hasNext()) {
iterator = iterator.next;
} else {
return null;
}
}
return iterator;
}

} Ich habe es jetzt so gelöst, es ist aber nicht der Sinn der Sache PI als Wert von start zu benutzen, da es dazu kommen kann, dass jemand PI in die liste einfügt. Hätten Sie eine Lösung wie es funktionieren könnte? Bearbeitung: Es klappt anscheinend auch wenn man PI einträgt, weil dann eine Null-Pointer-Exception geworfen wird. Denke es ist immernoch nicht Sinn und Zweck Bearbeitung2: Es klappt doch, weil ich man in diese Liste kein PI reinsetzen kann, weil es ein Liste ist, dessen elemente doubles aufnehmen. Mit Math.pi muss man pi immer mit (int) casten, weswegen die ganze Zahl von pi nicht eingefügt werden kann und das element start so funktionieren würde.
 
Zuletzt bearbeitet:
Aber der erste wagon ist null. Wenn ich dann etwas dranhängen möchte wird null irgendwie zu diesem element und der wagon dahinter auch.

/code public void insertLast(int value) {
if (start==null){
start = new ListElement(value);
} else {
ListElement newElement = new ListElement(value);
start.next = newElement;
}
}
Ich habe mir das irgendwie so gedacht, dass wenn der wagon 0 ist soll er ersetzt werden. Aber wenn der wagon nicht null ist soll er ans ende gehangen werden. Klappt aber nicht
Die Überlegung wegen null ist schon richtig (gut, im konkreten Code wird start im Konstruktor bereits mit einem Element initialisiert, normalerweise wäre start aber null).

Was Du im else-Zweig machen musst, dich bis zum letzten Element zu hangeln:
Java:
ListElement current = start; // wir fangen bei start an
while (current.next != null) { // so lange es ein weiteres Element gibt...
    current = current.next;  // ... schauen wir uns das als nächstes an
}
// an der Stelle ist current.next == null, also das Ende der Liste erreicht
// und da hängen wir jetzt das neue Element ran
current.next = newElement;
Die Zeile
Java:
ListElement newElement = new ListElement(value);
brauchst Du nur einmal vor dem if.
 

Zurück
Oben