Hallo Leute, ich bin Java-Anfänger und hänge seit Tagen an einer Aufgabe. Und zwar sollte ich zuerst eine Klasse Namens Wagen mit den Attributen firstClassSitze und secondClassSitze erstellen, welche mit einem parametrisierten Kontruktor initialisiert werden, das habe ich soweit hinbekomen. Nun muss ich ein Array des Typs Wagen erstellen, für einen ICE. Die Anzahl der Wagen des ICEs soll im int-Attribut anzahlWagen gespeichert werden, welche jedoch zunächst auf 0 gesetzt werden soll,also ist das Array leer. Die Aufgabe ist nun, dass ich eine Methode addWagen zum Hinzufügen eines Wagens an das Ende der ICE-Bahn implementieren soll. Wenn man dann später ein Wagen hinzufügt, soll das Attribut anzahlWagen um 1 erhöht werden. Da komme ich nicht wirjlich weiter.
Ich bin für jede Hilfe offen
Hallo Kneitzel, danke für deine Antwort. Ich kann dir Mal schnell schicken, was ich bereits hinbekommen habe. Leider wird anzahlWagen nicht erhöht, wenn ich einen Wagen hinzufüge.
a) Code bitte immer in Code Tags (Den Knopf </> links oberhalb des Eingabebereichs).
b) Überlege Dir den Ablauf am besten immer erst in Worten. Was musst Du genau machen? Ggf. einfach mit Stift und Papier einmal durchspielen!
Bei Dir sind zwei Dinge, die mir auffallen:
1. Aufpassen, wann Du was machst! Was gehört in die Schleife? Was gehört nicht in die Schleife?
2. Indices beachten! Was sind die Indices, die Du wann nutzen musst? Also bezüglich Grenzen und überall wo Du feste Indices hast musst du gut aufpassen (ggf. mal Dir ein Bild, so dass Du einen Überblick hast!)
Beschreibe doch bitte einmal in Worten, was Du genau machst. Visualisiere es einfach einmal. Also statt abstrakte Arrays: Stell Dir vor, Du hast ein Regal mit Boxen.
Du hast also ein Regal mit 3 Fächern und in jedem Fach ist eine Box. Nun kommt eine Box dazu. Was machst Du also?
- Erst einmal baust Du ein neues Regal mit 4 Fächern auf.
Wie geht es weiter?
Naja ich würde das alte Regal wegschmeißen. Sagen wir das alte Regal hatte die Referenz r. Wir müssten also alle Inhalte von r in das neue Regal kopieren und anschließend die Referenz r auf das neue Regal umleiten. Dann würde r auf das neue Regal zeigen und das alte Regal würde durch Java gelöscht werden, da keine Referenz mehr darauf zeigt.
Bitte wirklich ganz genau die Schritte benennen! Du schmeisst das alte Regal weg. Damit ist es weg und du kannst daraus nichts mehr nehmen.
In das neue Regal etwas kopieren - ja woher kommt das denn? Ist das plötzlich auf magische Weise da?
Es ist hier wirklich wichtig, jeden Schritt im Detail und genau zu betrachten.
Ein "alle Inhalte kopieren" ist dann als erster Schritt ok. Aber das ist noch kein Arbeitsablauf, mit dem man etwas anfangen kann. Das kann man stehen lassen, aber das muss dann als nächstes im Detail beschrieben werden. (Das würde dann bei der Umsetzung zu einem Methodenaufruf werden. Dann hat man halt eine Methode alleInhalteKopieren. Das ist in Ordnung und auch etwas, zu dem ich explizit raten würde. Denn damit verringert sich die Komplexität und so Fehler wie: "zu viel in die Schleife packen" entfallen.
Also ich bin leider immer noch nicht auf eine Lösung gekommen. Würdest du mir vielleicht doch sagen, wo im Code der Fehler liegt? Ich fürchte anders komme ich nicht weiter.
Du bist ja bisher überhaupt nicht auf den Vorschlag von @kneitzel eingegangen. Der ist ja durchaus sinnvoll. Wenn du das korrekt formulierst, kannst du es fast 1:1 in Code übersetzen.
Naja ich würde das alte Regal wegschmeißen. Sagen wir das alte Regal hatte die Referenz r. Wir müssten also alle Inhalte von r in das neue Regal kopieren und anschließend die Referenz r auf das neue Regal umleiten. Dann würde r auf das neue Regal zeigen und das alte Regal würde durch Java gelöscht werden, da keine Referenz mehr darauf zeigt.
publicstaticvoidaddWagen(Wagen o){Wagen[] newICE =newWagen[ICE.length+1];// es wird ein neues Array erzeugt, das ein Element größer ist als das Altefor(int i =0;i<=ICE.length ;i++){// Schleife über die Elemente des alten Arrays (hier ist ein kleines Problem!)
newICE[i]= ICE[i];// i-tes Element des alten in das neue Array kopieren
newICE[ICE.length-1]= o;// das letze Element des alten Arrays mit dem Parameter belegen
ICE = newICE;// das alte Array mit dem neuen Array "überschreiben", danach möchtest du dann:}// den nächsten Schleifendurchlauf für das nächste Element machen. Was steht denn dann im "alten" Array?}
publicstaticvoidaddWagen(Wagen o){Wagen[] newICE =newWagen[ICE.length+1];// es wird ein neues Array erzeugt, das ein Element größer ist als das Altefor(int i =0;i<=ICE.length ;i++){// Schleife über die Elemente des alten Arrays (hier ist ein kleines Problem!)
newICE[i]= ICE[i];// i-tes Element des alten in das neue Array kopieren
newICE[ICE.length-1]= o;// das letze Element des alten Arrays mit dem Parameter belegen
ICE = newICE;// das alte Array mit dem neuen Array "überschreiben", danach möchtest du dann:}// den nächsten Schleifendurchlauf für das nächste Element machen. Was steht denn dann im "alten" Array?}
wo musst du den neuen Wagen in das neue Array einsortieren? Doch nach dem Kopieren .
und welchen Platz hat das neue Objekt im neuen Regal ? ist da wirklich altes RegalGrösse minus 1?
Und wann änderst du die Ref also schmeißt das alte weg.
publicstaticvoidaddWagen(Wagen o){Wagen[] newICE =newWagen[ICE.length+1];// es wird ein neues Array erzeugt, das ein Element größer ist als das Altefor(int i =0;i<ICE.length ;i++){// Schleife über die Elemente des alten Arrays
newICE[i]= ICE[i];// i-tes Element des alten in das neue Array kopieren}// Kopieren fertig
newICE[ICE.length-1]= o;//ist das richtig das du es auf den zweiten Platz im neuen Rgal legen willst// ich gehe hier mal von den alten Ragal mit drei fächern aus .......}
Also war das newICE[ICE.length-1]=o; falsch. Nun sieht der Code bei mir so aus. Ich kann aber nur höchstes 2 Wagen hinzufügen, ab dem dritten Wagen bekomme ich einen Fehler.
public static void addWagen(Wagen o){
Wagen[] newICE = new Wagen[anzahlWagen+1];
for (int i = 0;i<anzahlWagen-1 ;i++ ) {
newICE = ICE;
} // end of for
newICE[anzahlWagen] = o;
newICE=ICE;
anzahlWagen++;
}
Untitled public static void addWagen(Wagen o){
Wagen[] newICE = new Wagen[anzahlWagen+1];
for (int i = 0;i<anzahlWagen-1 ;i++ ) {
newICE(i) = ICE(i);
} // end of for
newICE[anzahlWagen+1] = o;
ICE=newICE;
anzahlWagen++;
}
So sieht es bei mir jetzt aus. Ich bekomme aber leider immer noch ein Fehler: "Index 1 out of bounds for length 1"
Schreiben Sie eine Klasse IceBahn für eine ICE-Bahn im laufenden Betrieb. Die ICE-Bahn besteht aus einer Liste von Wagen. Realisieren Sie die Liste mithilfe eines Arrays mit einer Länge von 6. Überlegen Sie hierfür, wann Sie dieses Array erzeugen müssen, lassen Sie die Felder des Wagen-Arrays zunächst leer und setzen Sie das Array auf privat. Die aktuelle Wagenanzahl wird im int-Attribut anzahlWagen gespeichert, welches nur innerhalb der Klasse sichtbar ist (zum Verständnis: wenn anzahlWagen = 2 ist, dann bedeutet das, dass nur in den ersten beiden Einträgen des Arrays Referenzen auf Wagen gespeichert sind.). Setzen Sie diesen Wert am Anfang auf 0
danzahlWagen = 2 ist, dann bedeutet das, dass nur in den ersten beiden Einträgen des Arrays Referenzen auf Wagen gespeichert sind.). Setzen Sie diesen Wert am Anfang auf 0
publicclassIceBahn{staticint anzahlWagen =0;staticWagen[] ICE =newWagen[anzahlWagen];publicstaticvoidaddWagen(Wagen o){Wagen[] newICE =newWagen[anzahlWagen+1];for(int i =0;i<anzahlWagen-1;i++){
newICE[i]= ICE[i];}// end of for
newICE[anzahlWagen]= o;
ICE=newICE;
anzahlWagen++;}}
publicstaticvoid removeWagen (){Wagen[] newICE =newWagen[anzahlWagen-1];for(int i =0;i<anzahlWagen-1;i++){
newICE[i]= ICE[i];}// end of for
ICE = newICE;
anzahlWagen--;}
Ich konnte dank eurer Hilfe auch sofort die removeWagen Methode ableiten, vielen Dank nochmal, alleine hätte ich das nicht geschafft!
Das was du jetzt hast mit den immer neuen Array und kopieren. Entspricht aber nicht deiner Aufgabe.
Realisieren Sie die Liste mithilfe eines Arrays mit einer Länge von 6. Überlegen Sie hierfür, wann Sie dieses Array erzeugen müssen, lassen Sie die Felder des Wagen-Arrays zunächst leer und setzen Sie das Array auf privat.
Du hättest dir das neue erstellen und kopieren sparen können.
Du solltest ein privates Array der grösse 6 erstellen.
Da kannst du natürlich auch nur 6 Wagen anhängen. Mehr war auch nicht gefordert.
Deine Schuld du hast uns auch eine andere Aufgaben Stellung am Anfang gegeben.
AnzahlWagen ja aber das Array bekommt gleich die richtige größe.
So steht es in deiner letzten Aufgabenstellung. Welche nun die richtige Aufgabenstellung ist musst du wissen. Thread Anfang oder jetzt.
Der Grund ist einfach. Das [i] wird als Beginn eines kursiven Textes interpretiert, wenn es nicht in Code-Tags gesetzt wird. Man erkennt es auch deutlich daran, dass der Text nach dem verschwundenen [i] kursiv ist.
publicclassIceBahn{privatestaticint anzahlWagen =0;staticWagen[] ICE =newWagen[6];publicstaticintgetAnzahlWagen(){return anzahlWagen;}publicstaticvoidaddWagen(Wagen o){Wagen[] newICE =newWagen[anzahlWagen+1];for(int i =0;i<anzahlWagen-1;i++){
newICE[i]= ICE[i];}// end of for
newICE[anzahlWagen]= o;
ICE=newICE;
anzahlWagen++;}}
Ich habe das jetzt so gemacht. Aber ich glaube wenn ich jetzt einen neuen Wagen hinzufüge, werde die letzte Wagen gelöscht und nur der neu hinzufügte Wagen bleibt.
Genau. Das Problem ist, wenn ich zum Beispiel drei Wagen hinzufüge, dann zeigt ICE nur noch auf den dritten Wagen. Wagen1 und Wagen 2 haben dann aus irgendeinem Grund die Referenz null.