Zeile in 2d Array löschen

AkiJou

Neues Mitglied
Die Aufgabe ist
eine Methode Implementieren "void removeEntry(int[][] workArray, int col)"
Diese Methode entfernt aus jeder Zeile von workArray das Element mit dem Spaltenindex
col. Dadurch wird die Länge der entsprechenden Zeile um 1 kleiner. Ist an einem Spaltenindex
kein Element vorhanden, soll die Zeile nicht verändert werden. Dafür wird das Array
workArray umgebaut und kein neues Array erstellt. Sie dürfen aber innerhalb der Methode
ein temporäres Hilfs-Array anlegen.

Java:
private static void removeEntry(int[][] workArray, int col) {
    int row = workArray.length;
    //länge von größte Reihe berechnen
    int max = 0;
    int tempNum = 0;
    for (int[] ints : workArray) {
        tempNum = 0;
        for (int j = 0; j < ints.length; j++) {
            tempNum++;
            if (tempNum > max) {
                max = tempNum;
            }
        }
    }
    //neues Array wird um 1 Spalte kleiner
    int [][] newArray = new int[row][max];
    for(int i = 0; i < row; i++) {
        for(int j = 0; j < max; j++) {
            if(j < col && j < workArray[I].length) {
                newArray[I][j] = workArray[I][j];
            }else if (j == col) {
                // Do nothing
            } else if (j > col && j < workArray[I].length) {
                newArray[I][j - 1] = workArray[I][j];
            }
        }
    }
    for (int i = 0; i < workArray.length; i++) {
        for (int j = 0; j < workArray[I].length; j++) {
            workArray[I][j] = newArray[I][j];
        }
    }
    int remIndex = 0;
    for (int i = 0; i < workArray.length; i++) {
        for (int j = remIndex; j < workArray[I].length-1; j++) {
            if(workArray[I][j] == remIndex){
                workArray[I][j] = workArray[I][j + 1];
            }
       }
    }
Einzige was kann ich nicht schaffen ist 0 weglassen die bei manchen rauskommt
 

Anhänge

  • Screenshot 2022-05-29 130252.jpg
    Screenshot 2022-05-29 130252.jpg
    11,1 KB · Aufrufe: 1
Ist es denn eine Voraussetzung, dass keine Nullen stehen dürfen?
Wenn du eine Spalte einer Zeile löschen willst, dann brauchst du zuerst mal ein Array, das um 1 kürzer ist.
In dieses fügst du zunächst alle Spalten BIS zur zu löschenden ein, danach alle Felder NACH dem zu löschenden, hier muss der Zielindex um 1 kleiner sein.
Dann fügst die gesamte neue Zeile als Ganzes ins ursprüngliche Array ein (2D-Arrays gibt's nicht, was du da hast, ist ein Array von Zeilen, die wiederum als Array dargestellt sind).

Du brauchst also eine Schleife, die alle Zeilenindizes durchgeht.
In jedem Schritt brauchst du
a) ein neues Array der Länge lineLength-1
b) 2 Schleifen, mal mit Index von 0 ... (columnToDelete-1) und mal von (columnToDelete+1) ... (lineLength-1) zum Übertragen der Werte.
c) eine Zuweisung.

Mach dir also erst mal Gedanken darüber, wieso in deinem Code so viele Schleifen zu finden sind.
In deinem Titel steht 'Zeile löschen' ... im Aufgabentext geht es aber um Spalten. Vielleicht beruht das Missverständnis hierrauf?

Man kann pro Zeile sogar noch eleganter arbeiten, indem man die System.arrayCopy Methode verwendet anstatt der beiden Schleifen. Aber ich denke, Sinn der Aufgabe ist, dass ihr mit Indizes zu arbeiten lernt, also lass die mal außen vor.

Tip: Prüfe als erstes, ob lineLength > 0 ist, ansonsten brauchst du gar nichts zu machen,
 
Ist es denn eine Voraussetzung, dass keine Nullen stehen dürfen?
Wenn du eine Spalte einer Zeile löschen willst, dann brauchst du zuerst mal ein Array, das um 1 kürzer ist.
In dieses fügst du zunächst alle Spalten BIS zur zu löschenden ein, danach alle Felder NACH dem zu löschenden, hier muss der Zielindex um 1 kleiner sein.
Dann fügst die gesamte neue Zeile als Ganzes ins ursprüngliche Array ein (2D-Arrays gibt's nicht, was du da hast, ist ein Array von Zeilen, die wiederum als Array dargestellt sind).

Du brauchst also eine Schleife, die alle Zeilenindizes durchgeht.
In jedem Schritt brauchst du
a) ein neues Array der Länge lineLength-1
b) 2 Schleifen, mal mit Index von 0 ... (columnToDelete-1) und mal von (columnToDelete+1) ... (lineLength-1) zum Übertragen der Werte.
c) eine Zuweisung.

Mach dir also erst mal Gedanken darüber, wieso in deinem Code so viele Schleifen zu finden sind.
In deinem Titel steht 'Zeile löschen' ... im Aufgabentext geht es aber um Spalten. Vielleicht beruht das Missverständnis hierrauf?

Man kann pro Zeile sogar noch eleganter arbeiten, indem man die System.arrayCopy Methode verwendet anstatt der beiden Schleifen. Aber ich denke, Sinn der Aufgabe ist, dass ihr mit Indizes zu arbeiten lernt, also lass die mal außen vor.

Tip: Prüfe als erstes, ob lineLength > 0 ist, ansonsten brauchst du gar nichts zu machen,
Ja stimmt Spalte, hab mich verschrieben.
Danke für den tipp!
 

Neue Themen


Zurück
Oben