Übergabe von Werten (zweidimensionales Array) aus einer Methode an zweidimensionales Array in main()

killermuck

Mitglied
Javascript:
//für das Einlesen
import javax.swing.*;

//für die Sonderfunktionen der Arrays
import java.util.Arrays;

public class Einsendeaufgabe_4 {
    static int kistenNummer; //Variable als Klassenvariable gesetzt, da diese überall bekannt sein soll
        
    //Methode1 - neue Kiste erfassen
    static int[][] neueKiste(int[][] argneueKiste) {
        int länge, breite, höhe;
        String nKisteEinlesen = null; //String-Variable für den Eingabedialog
        char nKisteFunktionWahl; //charVariable um nur das erste Zeichen der Eingabe zu verwenden
        boolean nKisteBeenden = false; //Flag-Variable für Endlosschleife   
        
        do { //Schleife zum beenden der Kisteneingabe
            
        do { //neue Kiste eingeben
            kistenNummer = Integer.parseInt(JOptionPane.showInputDialog("Bitte die Nummer der neuen Kiste eingeben"));
            // Prüfung, ob Eingabe innerhalb des Gültigkeitsbereichs von kistenNummer 1-75 liegt
            if (kistenNummer >0 || kistenNummer <=75) {
            //Prüfung, ob die Kiste schon vorhanden ist, wenn nein, dann Daten eingeben
                
                if (argneueKiste[kistenNummer-1][0] == 0) {
                
                //Wert kistenNummer dem Array werte zuweisen
                argneueKiste[kistenNummer-1][0]=kistenNummer;
                
                //Werte für länge, breite und höhe einlesen und dem Array zuweisen
                länge = Integer.parseInt(JOptionPane.showInputDialog("Kistenlänge"));
                argneueKiste[kistenNummer-1][1]=länge;
                
                breite = Integer.parseInt(JOptionPane.showInputDialog("Kistenbreite"));
                argneueKiste[kistenNummer-1][2]=breite;
                
                höhe = Integer.parseInt(JOptionPane.showInputDialog("Kistenhöhe"));
                argneueKiste[kistenNummer-1][3]=höhe;
                
                }
                else System.out.println("Diese Kistennummer ist bereits vorhanden,\bitte versuchen Sie es erneut!");
            }
            else System.out.println("Die Eingabe war nicht korrekt!\nDer Wert muss von 1 - 75 sein");
            }
            
        while(kistenNummer <= 0 || kistenNummer>argneueKiste.length);
            nKisteBeenden = true;
            }
        while(nKisteBeenden == false); //Ende der Kisteneingabe
        
        nKisteBeenden = true;
        
        return argneueKiste; //Übergabe der Werte - KistenNummer, länge, breite, höhe - aus der Methode an main()
    }
    
public static void main(String[] args) {
        int[][] aKistenArray = new int [75][4]; //Zweidimensionaler Array 4 Spalten / 75 Zeilen
        String funktionEinlesen = null; //String-Variable für den Eingabedialog
        char funktionWahl; //charVariable um nur das erste Zeichen der Eingabe zu verwenden
        int i = 1; //Variable für Endlosschleife um main() am Laufen zu halten
        
        for (i = 1; i > 0; i++) { //bewusste Endlosschleife, da das Programm laufen muss, damit die Werte der Variablen nicht verloren gehen!!!!

        //Eingabe der gewünschten Funktion
        funktionEinlesen = JOptionPane.showInputDialog("Bitte wählen Sie die gewüschte Funktion aus: \n1 = neue Kiste erfassen \n2 = Kiste löschen \n3 = Kiste ändern \n4 = Kiste suchen und Wete anzeigen \n5 = Kisten in einer Liste anzeigen \n6 = Programm beenden");
        // nur das erste Zeichen nehmen
        funktionWahl = funktionEinlesen.charAt(0);
        //die Auswertung von funktionWahl
        switch (funktionWahl) {
        //der case-Zweig für 1
        case '1':
            //Methode1 - Kiste neu eingeben
            neueKiste(aKistenArray); //übergabe der Werte von aKistenArray in die Methode neueKiste
            //übergabe der Werte aus argneueKiste in aKistenArray
            //System.arraycopy(wert, kistenNummer-1, aKistenArray], kistenNummer-1, 4);
            //aKistenArray = Arrays.copyOf(argneueKiste(10, 20, 30, 40),4);
            
            //Ausgabe der übergebenen Werte aus aKistenArray
            System.out.println("\nSie haben folgende Kiste neu erfasst:");
            System.out.println("Nr.\tlänge\tbreite\thöhe");
            System.out.println(aKistenArray[kistenNummer-1][0] + "\t" + aKistenArray[kistenNummer-1][1] + "\t" + aKistenArray[kistenNummer-1][2] + "\t" + aKistenArray[kistenNummer-1][3]);
            i = 1; //Wert für die Endlosschleife
            break;
            //der case-Zweig für 2
        case '2':
            System.out.println("Sie haben die Auswahl: " + funktionEinlesen + "getroffen.");
            //löschenKiste (kistenArray);
            break;
            //der case-Zweig für 3
        case '3':
            System.out.println("Sie haben die Auswahl: " + funktionEinlesen + "getroffen.");
            //ändernKiste (kistenArray);
            break;
            //der case-Zweig für 4
        case '4':
            kisteSuchen(aKistenArray);
            break;
            //der case-Zweig für 5
        case '5':
            System.out.println("Sie haben die Auswahl: " + funktionEinlesen + "getroffen.");
            kisteListe(aKistenArray);
            break;
            //der case-Zweig für 6
        case '6':
            //Programm beenden?
            i = 0;
            System.exit(0);
            break;   
        //für alle anderen Eingaben
        default:
            System.out.println("\nSie haben keine gültige Auswahl getroffen!");
        } //hier endet die Auswertung von funktionWahl
        }
    }


    
    }
Hallo,

ich habe jetzt schon so viele Varianten durchgetestet und weiß einfach nicht mehr weiter.

In meinem Code werden die Werte aus der Methode neueKiste an das Array in main() "aKistenArray weitergeben und auch ausgegeben.
Allerdings werden die Werte nicht über Arrays.copyOf oder System.arraycopy in aKistenArray kopiert, was wohl
programmiertechnisch nicht korrekt ist.

Kann mir jemand sagen, wie ich das Problem lösen kann?

Vielen dank im Voraus für eure Hilfe.
Bin mittlerweile schon am verzweifeln!!!!
 
werden die Werte nicht über Arrays.copyOf oder System.arraycopy in aKistenArray kopiert, was wohl
programmiertechnisch nicht korrekt ist
Schreib dir doch gerade eine Hilfs-Methode:
Java:
	public static int[][] copyArray(int[][] intArr) {
		int[][] b = new int[intArr.length][];
		for (int i = 0; i < intArr.length; i++) {
			b[i] = Arrays.copyOf(intArr[i], intArr[i].length);
		}
		return b;
	}
 
Allerdings werden die Werte nicht über Arrays.copyOf oder System.arraycopy in aKistenArray kopiert, was wohl
programmiertechnisch nicht korrekt ist.
Warum sollte das nicht korrekt sein?

neueKiste verändert das übergebene Array, "fügt" also quasi "dem Lager" die Kiste hinzu. Weil das Array verändert wird, ist die Rückgabe überflüssig, die nutzt du aber sowieso nicht.
 
@killermuck bitte den Code mit vernünftigen Einrückungen posten, das ist sonst sehr schwer zu lesen:
Java:
//für das Einlesen
import javax.swing.*;

//für die Sonderfunktionen der Arrays
import java.util.Arrays;

public class Einsendeaufgabe_4 {
    static int kistenNummer; //Variable als Klassenvariable gesetzt, da diese überall bekannt sein soll
        
    //Methode1 - neue Kiste erfassen
    static int[][] neueKiste(int[][] argneueKiste) {
        int länge, breite, höhe;
        String nKisteEinlesen = null; //String-Variable für den Eingabedialog
        char nKisteFunktionWahl; //charVariable um nur das erste Zeichen der Eingabe zu verwenden
        boolean nKisteBeenden = false; //Flag-Variable für Endlosschleife   
        
        do { //Schleife zum beenden der Kisteneingabe
            
            do { //neue Kiste eingeben
                kistenNummer = Integer.parseInt(JOptionPane.showInputDialog("Bitte die Nummer der neuen Kiste eingeben"));
                // Prüfung, ob Eingabe innerhalb des Gültigkeitsbereichs von kistenNummer 1-75 liegt
                if (kistenNummer >0 || kistenNummer <=75) {
                //Prüfung, ob die Kiste schon vorhanden ist, wenn nein, dann Daten eingeben
                    
                    if (argneueKiste[kistenNummer-1][0] == 0) {
                    
                    //Wert kistenNummer dem Array werte zuweisen
                    argneueKiste[kistenNummer-1][0]=kistenNummer;
                    
                    //Werte für länge, breite und höhe einlesen und dem Array zuweisen
                    länge = Integer.parseInt(JOptionPane.showInputDialog("Kistenlänge"));
                    argneueKiste[kistenNummer-1][1]=länge;
                    
                    breite = Integer.parseInt(JOptionPane.showInputDialog("Kistenbreite"));
                    argneueKiste[kistenNummer-1][2]=breite;
                    
                    höhe = Integer.parseInt(JOptionPane.showInputDialog("Kistenhöhe"));
                    argneueKiste[kistenNummer-1][3]=höhe;
                    
                    }
                    else System.out.println("Diese Kistennummer ist bereits vorhanden,\bitte versuchen Sie es erneut!");
                }
                else System.out.println("Die Eingabe war nicht korrekt!\nDer Wert muss von 1 - 75 sein");
            } while(kistenNummer <= 0 || kistenNummer>argneueKiste.length);

            nKisteBeenden = true;
        } while(nKisteBeenden == false); //Ende der Kisteneingabe
        
        nKisteBeenden = true;
        
        return argneueKiste; //Übergabe der Werte - KistenNummer, länge, breite, höhe - aus der Methode an main()
    }
    
    public static void main(String[] args) {
        int[][] aKistenArray = new int [75][4]; //Zweidimensionaler Array 4 Spalten / 75 Zeilen
        String funktionEinlesen = null; //String-Variable für den Eingabedialog
        char funktionWahl; //charVariable um nur das erste Zeichen der Eingabe zu verwenden
        int i = 1; //Variable für Endlosschleife um main() am Laufen zu halten
        
        for (i = 1; i > 0; i++) { //bewusste Endlosschleife, da das Programm laufen muss, damit die Werte der Variablen nicht verloren gehen!!!!

            //Eingabe der gewünschten Funktion
            funktionEinlesen = JOptionPane.showInputDialog("Bitte wählen Sie die gewüschte Funktion aus: \n1 = neue Kiste erfassen \n2 = Kiste löschen \n3 = Kiste ändern \n4 = Kiste suchen und Wete anzeigen \n5 = Kisten in einer Liste anzeigen \n6 = Programm beenden");
            // nur das erste Zeichen nehmen
            funktionWahl = funktionEinlesen.charAt(0);
            //die Auswertung von funktionWahl
            switch (funktionWahl) {
            //der case-Zweig für 1
            case '1':
                //Methode1 - Kiste neu eingeben
                neueKiste(aKistenArray); //übergabe der Werte von aKistenArray in die Methode neueKiste
                //übergabe der Werte aus argneueKiste in aKistenArray
                //System.arraycopy(wert, kistenNummer-1, aKistenArray], kistenNummer-1, 4);
                //aKistenArray = Arrays.copyOf(argneueKiste(10, 20, 30, 40),4);
                
                //Ausgabe der übergebenen Werte aus aKistenArray
                System.out.println("\nSie haben folgende Kiste neu erfasst:");
                System.out.println("Nr.\tlänge\tbreite\thöhe");
                System.out.println(aKistenArray[kistenNummer-1][0] + "\t" + aKistenArray[kistenNummer-1][1] + "\t" + aKistenArray[kistenNummer-1][2] + "\t" + aKistenArray[kistenNummer-1][3]);
                i = 1; //Wert für die Endlosschleife
                break;
                //der case-Zweig für 2
            case '2':
                System.out.println("Sie haben die Auswahl: " + funktionEinlesen + "getroffen.");
                //löschenKiste (kistenArray);
                break;
                //der case-Zweig für 3
            case '3':
                System.out.println("Sie haben die Auswahl: " + funktionEinlesen + "getroffen.");
                //ändernKiste (kistenArray);
                break;
                //der case-Zweig für 4
            case '4':
                kisteSuchen(aKistenArray);
                break;
                //der case-Zweig für 5
            case '5':
                System.out.println("Sie haben die Auswahl: " + funktionEinlesen + "getroffen.");
                kisteListe(aKistenArray);
                break;
                //der case-Zweig für 6
            case '6':
                //Programm beenden?
                i = 0;
                System.exit(0);
                break;   
            //für alle anderen Eingaben
            default:
                System.out.println("\nSie haben keine gültige Auswahl getroffen!");
            } //hier endet die Auswertung von funktionWahl
        }
    }    
}

Eine Frage: soll man vor lauter Kommentaren den Code nicht mehr sehen können? Ich meine, dokumentieren ist ja nett und schön und in der Ausbildung wird da gerne Ausführlichkeit verlangt, aber den Quelltext ins Deutsche zu übersetzen, kann ja nun auch nicht Sinn und Zweck der Sache sein. Zum Beispiel
Java:
    //der case-Zweig für 6
case '6':

Was soll die äußere Schleife in neueKiste bringen?
Wozu eine Endlosschleife in main, wenn es doch case 6 gibt?
Wenn Du aKistenArray z. B. mit 70 deklarierst, funktioniert Dein Code dann noch?
Darfst Du eigene Methoden erstellen? Wenn ja, warum strukturierst Du dann Deinen Code nicht etwas besser?
In dem Zusammenhang: gibt es für länge, beite, höhe nicht auch einen Wertebereich?
Jetzt höre ich mal auf 😉
 

Zurück
Oben