staticvoidloeschen(int[][] argLoeschen){int eingabe;
eingabe =Integer.parseInt(JOptionPane.showInputDialog("Geben Sie die Kistennummer ein die geloscht werden soll."));for(int i =0; i < argLoeschen.length; i++){for(int j =0; j < argLoeschen[i].length; j++){if(argLoeschen[i][j]== eingabe){
argLoeschen[0][0]= eingabe;System.out.print(eingabe +" wurde geloscht");return;}}}if(eingabe != argLoeschen.length)System.out.print(eingabe +"ist nicht vorhanden");}
Output:
[2, 0, 0, 0]
Das Programm soll ein bestimmtes Array auf den Wert 0 setzen. Ich habe das Problem, dass nur die letzten drei gelöscht werden (siehe Output).
Ok, wenn ich dann den Code, den ich bereit gestellt habe, entsprechend anpasse, dann wäre das also etwas wie:
Java:
publicstaticfinalint KISTEN_NUMMER =0;publicstaticfinalint KISTEN_BREITE =1;publicstaticfinalint KISTEN_LAENGE =2;publicstaticfinalint KISTEN_HOEHE =3;publicstaticfinalint KEINE_DATEN =0;staticvoidloeschen(int[][] kistenDaten){int kistenNummer;
kistenNummer =Integer.parseInt(JOptionPane.showInputDialog("Geben Sie die Kistennummer ein die geloscht werden soll."));for(int index =0; index < kistenDaten.length; index++){if(kistenDaten[index][KISTEN_NUMMER]== kistenNummer){...
Die Aussage: "Ein Array auf den Wert 0 setzen" ergibt keinen Sinn.
Ein Array ist ein Array (mehrere Werte) und der Wert 0 ist ein einzelner Wert (Skalar).
Meinst du damit, dass du alle Elemente des Arrays mit dem Wert 0 befüllen möchtest?
Die Aussage: "Ein Array auf den Wert 0 setzen" ergibt keinen Sinn.
Ein Array ist ein Array (mehrere Werte) und der Wert 0 ist ein einzelner Wert (Skalar).
Meinst du damit, dass du alle Elemente des Arrays mit dem Wert 0 befüllen möchtest?
Ich würde Dir empfehlen, immer erst genau in Worten zu formulieren, was Du machen willst. Dazu gehört auch eine klare Information, wie Daten gehalten werden.
Das wären dann hier z.B.:
In einem zweidimensionalen Array können Kistennummern gespeichert werden. Leere Felder sind 0. Gefüllte Felder enthalten die Kistennummer.
Um eine Kistennummer zu löschen:
gehe ich das Array durch und schaue, ob ich die Kistennummer finde.
wenn ich die Kistennummer gefunden habe, markiere ich das Feld als leer.
Wenn man so etwas hat, dann kann man auch alles vernünftig benennen. argLoeschen besagt absolut nichts aus! Das ist maximal eine Angabe, wo es deklariert wurde! Mit schlechten Namen machst Du dir selbst das Leben unnötig schwer! Auch i und j lehne ich in der Regel ab! Das wären hier sowas wie reihe und spalte.
Nummern so im Code sind immer schlecht: argLoeschen[0][0]
Wenn Du solche "magic numbers" ersetzt durch Konstanten, dann hättest du da etwas wie argLoeschen[ERSTE_ZEILE][ERSTE_SPALTE] und man erkennt eigentlich auf den ersten Blick: Moment - in der ersten Zeile / ersten Spalte wollte ich doch nichts machen ....
Und als zweiten Hinweis: Spiel sowas doch einfach etwas durch:
Nimm Dir ein Zettel und mal die so ein 2D Array auf mit irgendwelchen Werten.
Dann spiel es durch - was passiert? Ist es das, was Du willst?
staticvoidloeschen(int[][] argLoeschen){int eingabe;
eingabe =Integer.parseInt(JOptionPane.showInputDialog("Geben Sie die Kistennummer ein die geloscht werden soll."));for(int i =0; i < argLoeschen.length; i++){if(argLoeschen[i][0]== eingabe){
argLoeschen[i][0]=0;}
Es wird nur die Kistennummer gelöscht, die Daten sollen auch gelöscht werden.
staticvoidloeschen(int[][] argLoeschen){int eingabe;
eingabe =Integer.parseInt(JOptionPane.showInputDialog("Geben Sie die Kistennummer ein die geloscht werden soll."));for(int i =0; i < argLoeschen.length; i++){if(argLoeschen[i][0]== eingabe){
argLoeschen[i][0]=0;}
Es wird nur die Kistennummer gelöscht, die Daten sollen auch gelöscht werden.
Dann wird aus der "magic number" 0 die Konstante. Und dann bennennen wir noch etwas mehr um:
Code:
public static final int KISTEN_NUMMER = 0;
public static final int KISTEN_INHALT = 0;
public static final int KEINE_KISTE = 0;
static void loeschen(int [][] kistenDaten) {
int kistenNummer;
kistenNummer = Integer.parseInt(JOptionPane.showInputDialog("Geben Sie die Kistennummer ein die geloscht werden soll."));
for (int index = 0; index < kistenDaten.length; index++) {
if(kistenDaten[index][KISTEN_NUMMER] == kistenNummer) {
kistenDaten[index][KISTEN_NUMMER] = KEINE_KISTE;
}
Das ist doch beim Lesen deutlich besser zu verstehen, oder? Und das ist nun eine wirklich einfache Änderung. Und Variablen heissen nun nach Ihrem Inhalt. Und dann ist da eine Kistennummer eingegeben worden. Dass es hier eine Eingabe war, ist dabei ja egal.
Dann lösch diese doch auch - so wie du die erste auf einen spezifischen Wert gesetzt hast, kannst Du dies doch auch mit der zweiten Ebene auch machen. Da es genau zwei Ebenen gibt, ist es nur eine weitere Zeile.
Dann wird aus der "magic number" 0 die Konstante. Und dann bennennen wir noch etwas mehr um:
Code:
public static final int KISTEN_NUMMER = 0;
public static final int KISTEN_INHALT = 0;
public static final int KEINE_KISTE = 0;
static void loeschen(int [][] kistenDaten) {
int kistenNummer;
kistenNummer = Integer.parseInt(JOptionPane.showInputDialog("Geben Sie die Kistennummer ein die geloscht werden soll."));
for (int index = 0; index < kistenDaten.length; index++) {
if(kistenDaten[index][KISTEN_NUMMER] == kistenNummer) {
kistenDaten[index][KISTEN_NUMMER] = KEINE_KISTE;
}
Das ist doch beim Lesen deutlich besser zu verstehen, oder? Und das ist nun eine wirklich einfache Änderung. Und Variablen heissen nun nach Ihrem Inhalt. Und dann ist da eine Kistennummer eingegeben worden. Dass es hier eine Eingabe war, ist dabei ja egal.
Ein Array kann nie 0 sein, du kannst es höchstens auf null setzen. Die Größe eines Arrays kannst du auch nicht verändern. Um das zu erreichen, musst du ein neues Array anlegen und die alten Werte reinkopieren.
Wenn du die einzelnen Felder initialisieren oder zurücksetzen willst, dann machst du das wie oben beschrieben.
Um hier etwas mehr Licht ins Dunkle zu bringen.
Dann zeige oder verrate uns mal auf welchen Index die Daten in der zweiten Dimension geschrieben werden. Konrad hat hier Index „1“ angenommen.
Ist das auch so in deinem Programm?
Zb.
kistenDaten[1][0] ist die KistenNr. (1)
kistenDaten[1][1] sind die Kisten Daten (2345)
kistenDaten[2][0] ist die KistenNr. (2)
kistenDaten[2][1] sind die Kisten Daten (7894)
…
kistenDaten[15][0] ist die KistenNr. (15)
kistenDaten[15][1] sind die Kisten Daten (2636)
Oder sind die Daten der index der Kiste
kistenDaten[1][0] ist die KistenNr. (1)
kistenDaten[1][1] sind die Kisten Daten (2345)
kistenDaten[2][0] ist die KistenNr. (2)
kistenDaten[2][2] sind die Kisten Daten (7894)
…
kistenDaten[15][0] ist die KistenNr. (15)
kistenDaten[15][15] sind die Kisten Daten (2636)
Dann wird aus der "magic number" 0 die Konstante. Und dann bennennen wir noch etwas mehr um:
Code:
public static final int KISTEN_NUMMER = 0;
public static final int KISTEN_INHALT = 0; // soll bestimmt = 1 sein
public static final int KEINE_KISTE = 0;
[/QUOTE]
Um hier etwas mehr Licht ins Dunkle zu bringen.
Dann zeige oder verrate uns mal auf welchen Index die Daten in der zweiten Dimension geschrieben werden. Konrad hat hier Index „1“ angenommen.
Ist das auch so in deinem Programm?
Zb.
kistenDaten[1][0] ist die KistenNr. (1)
kistenDaten[1][1] sind die Kisten Daten (2345)
kistenDaten[2][0] ist die KistenNr. (2)
kistenDaten[2][1] sind die Kisten Daten (7894)
…
kistenDaten[15][0] ist die KistenNr. (15)
kistenDaten[15][1] sind die Kisten Daten (2636)
Oder sind die Daten der index der Kiste
kistenDaten[1][0] ist die KistenNr. (1)
kistenDaten[1][1] sind die Kisten Daten (2345)
kistenDaten[2][0] ist die KistenNr. (2)
kistenDaten[2][2] sind die Kisten Daten (7894)
…
kistenDaten[15][0] ist die KistenNr. (15)
kistenDaten[15][15] sind die Kisten Daten (2636)
Kannst Du denn sagen, was in dem Array wo gespeichert werden soll? Der erste Index von 0 .. 74 sind die 75 Kistenplätze, beim Zweiten Index ist in Index 0 die Kistennummer. Was wird in index 1, 2 und 3 gespeichert?
Um hier etwas mehr Licht ins Dunkle zu bringen.
Dann zeige oder verrate uns mal auf welchen Index die Daten in der zweiten Dimension geschrieben werden. Konrad hat hier Index „1“ angenommen.
Ist das auch so in deinem Programm?
Zb.
kistenDaten[1][0] ist die KistenNr. (1)
kistenDaten[1][1] sind die Kisten Daten (2345)
kistenDaten[2][0] ist die KistenNr. (2)
kistenDaten[2][1] sind die Kisten Daten (7894)
…
kistenDaten[15][0] ist die KistenNr. (15)
kistenDaten[15][1] sind die Kisten Daten (2636)
Oder sind die Daten der index der Kiste
kistenDaten[1][0] ist die KistenNr. (1)
kistenDaten[1][1] sind die Kisten Daten (2345)
kistenDaten[2][0] ist die KistenNr. (2)
kistenDaten[2][2] sind die Kisten Daten (7894)
…
kistenDaten[15][0] ist die KistenNr. (15)
kistenDaten[15][15] sind die Kisten Daten (2636)
Kannst Du denn sagen, was in dem Array wo gespeichert werden soll? Der erste Index von 0 .. 74 sind die 75 Kistenplätze, beim Zweiten Index ist in Index 0 die Kistennummer. Was wird in index 1, 2 und 3 gespeichert?
Kannst Du denn sagen, was in dem Array wo gespeichert werden soll? Der erste Index von 0 .. 74 sind die 75 Kistenplätze, beim Zweiten Index ist in Index 0 die Kistennummer. Was wird in index 1, 2 und 3 gespeichert?
Ich habe das Problem, dass nur die Kistennummer gelöscht wird. Ich möchte aber das auch die Daten also die Breite, Länge und Höhe gelöscht werden.
z.B: {1,3,7,9} soll {0,0,0,0} ich bekomme aber dieses Output: {0,3,7,9}.
Java:
staticvoidloeschen(int[][] argLoeschen){int kistenNummer;
kistenNummer =Integer.parseInt(JOptionPane.showInputDialog("Geben Sie die Kistennummer ein die geloscht werden soll."));for(int index =0; index < argLoeschen.length; index++){if(argLoeschen[index][0]== kistenNummer)
argLoeschen[index][0]=0;System.out.print(kistenNummer +" wurde geloscht");return;}}
Ok, wenn ich dann den Code, den ich bereit gestellt habe, entsprechend anpasse, dann wäre das also etwas wie:
Java:
publicstaticfinalint KISTEN_NUMMER =0;publicstaticfinalint KISTEN_BREITE =1;publicstaticfinalint KISTEN_LAENGE =2;publicstaticfinalint KISTEN_HOEHE =3;publicstaticfinalint KEINE_DATEN =0;staticvoidloeschen(int[][] kistenDaten){int kistenNummer;
kistenNummer =Integer.parseInt(JOptionPane.showInputDialog("Geben Sie die Kistennummer ein die geloscht werden soll."));for(int index =0; index < kistenDaten.length; index++){if(kistenDaten[index][KISTEN_NUMMER]== kistenNummer){
kistenDaten[index][KISTEN_NUMMER]= KEINE_DATEN;
kistenDaten[index][KISTEN_BREITE]= KEINE_DATEN;
kistenDaten[index][KISTEN_HOEHE]= KEINE_DATEN;
kistenDaten[index][KISTEN_LAENGE]= KEINE_DATEN;}
Ich weiss nicht, in wie weit Ihr Konstanten schon gelernt habt. Mit diesen "public static final int" definiere ich einfache Variablen:
Durch das public sind diese wirklich von überall verfügbar. Das kannst Du jetzt erst einmal ignorieren.
static - das ist bei euch derzeit noch alles. Ihr arbeitet noch nicht objektorientiert. Aber die Methoden sind static und daher muss das auch static sein.
final - Nach der Initialisierung ist der Wert nicht mehr veränderbar.
int ist der Datentyp - halt das, was Du auch schon von Variablen selbst kennst.
Das mit den Konstanten ist halt ein großer Vorteil um Fehler zu sehen: breite / laenge / hoehe kann man ja schnell mal vertauschen. Ob das nun 1, 2 oder 3 ist, kann man sich ja nicht wirklich merken. Daher wird es einmal zentral festgelegt und dann diese Festlegung immer verwendet.
Von mir aus kann man das auch gerne alles weglassen, wenn Dich das noch zu sehr irritiert. Aber das mit den Namen der Variablen solltest Du Dir zu Herzen nehmen. Das macht Dir das Leben wirklich deutlich leichter weil es Dir hilft, den Überblick zu bewahren.
Generell würde ich Dir gerne auch noch eine Sache zeigen: Die Unterteilung in mehrere Methoden: Methoden sollten immer so einfach wie möglich aufgebaut sein. Wenn man sich das anschaut, was der Code macht, dann ist das ja nur ein:
Frage nach einer Kistennummer
Gehe alle Kisten durch
-- Wenn die aktuelle Kiste die gesuchte Kistennummer hat, dann lösche die Kiste.
Das kann man auch im Code entsprechend schreiben:
Java:
publicstaticfinalint KISTEN_NUMMER =0;publicstaticfinalint KISTEN_INHALT =0;publicstaticfinalint KEINE_KISTE =0;staticvoidloeschen(int[][] kistenDaten){int kistenNummer =frageNachKistennummer();for(int index =0; index < kistenDaten.length; index++){if(kistenDaten[index][KISTEN_NUMMER]== kistenNummer){loescheKiste(kistenDaten, kistenNummer);}}}staticintfrageNachKistennummer(){returnInteger.parseInt(JOptionPane.showInputDialog("Geben Sie die Kistennummer ein die geloscht werden soll."));}staticvoidloescheKiste(int[][] kistenDaten,int index){
kistenDaten[index][KISTEN_NUMMER]= KEINE_KISTE;
kistenDaten[index][KISTEN_BREITE]= KEINE_KISTE;
kistenDaten[index][KISTEN_LAENGE]= KEINE_KISTE;
kistenDaten[index][KISTEN_HOEHE]= KEINE_KISTE;}
So hast du nun Methoden, die Du zum einen an allen möglichen Stellen nutzen kannst. Evtl. musst Du ja auch an anderen Stellen nach einer Kistennummer fragen. Und zum Anderen hast Du es leichter, die Methode anzupassen. Evtl. willst Du ja zukünftig die Frage nach einer Kistennummer verändern: Diese muss vielleicht zukünftig > 0 und < 1000 sein und wenn eine ungültige Zahl eingegeben wird, dann soll der Nutzer informiert und erneut gefragt werden. Mit der Unterteilung ist klar, wo da die Anpassung sein muss und es wird auch deutlich, wie gut diese Aufteilung ist, denn Du musst es nicht mehrfach schreiben.
Das ist ja jetzt in dem Code auch schon mit drin. Bisher war nur die Kistennummer gelöscht - aber das ist ja eine einfache Zuweisung. Diese kannst Du auch für Höhe, Breite und Länge ebenso hinzu fügen.
Alternativ kannst Du das auch in einer Schleife machen.