Warum funktioniert die Lösung von CodeGym aber meine nicht?

Blackratone

Neues Mitglied
Hallo alle zusammen!
Ich bin noch relativ neu hier und dies ist mein erster Beitrag. Ich versuche mit Hilfe von CodeGym Java programmieren zu lernen und habe nun eine Aufgabe gehabt eine Reihe von Zahlen von der Tastatur einzulesen und von groß nach klein zu sortieren. Der meiste Code ist schon vorgegeben und eigentlich auch klar. Nur die sortieren() Methode sollte man selber programmieren. Meine Lösung ist:

Java:
package de.codegym.task.task07.task0728;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;

/*
In absteigender Reihenfolge
*/

public class Solution {
    public static void main(String[] args) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int[] array = new int[20];
        for (int i = 0; i < 20; i++) {
            array[i] = Integer.parseInt(reader.readLine());
        }

        sortieren(array);

        for (int x : array) {
            System.out.println(x);
        }
    }

    public static void sortieren(int[] array) {
        //schreib hier deinen Code
        ArrayList<Integer> zahlen = new ArrayList<>();
        for(int x : array) {
            zahlen.add(x);
        }

        for(int i=zahlen.size(); i<0; i--) {
            int max = zahlen.get(0);
            for(int j=0; j<zahlen.size(); j++) {
                if(zahlen.get(j)>max) {
                    max = zahlen.get(j);
                }
            }

            for(int k=0; k<zahlen.size(); k++) {
                if(zahlen.get(k)==max) {
                    array[i] = zahlen.remove(k);
                }
            }
        }
    }
}

Aber das funktioniert nicht, weil anscheinend nur eine Kopie des Arrays innerhalb der sortieren() Methode verändert wird und nicht das ursprüngliche Array selbst.
Die Lösung von CodeGym sieht so aus:

Java:
package de.codegym.task.task07.task0728;

import java.io.BufferedReader;
import java.io.InputStreamReader;

/*
   In absteigender Reihenfolge
*/

public class Solution {

    public static void main(String[] args) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int[] array = new int[20];
        for (int i = 0; i < 20; i++) {
            array[i] = Integer.parseInt(reader.readLine());
        }

        sortieren(array);

        for (int x : array) {
            System.out.println(x);
        }
    }

    public static void sortieren(int[] array) {
        for (int i = 0; i < array.length; i++) {
            for (int j = i; j < array.length; j++) {
                if (array[i] < array[j]) {
                    int temp = array;
                    array[i] = array[j];
                    array[j] = temp;
                }
            }
        }
    }
}

Klar, mein Code ist noch sehr unbeholfen aber er sollte doch funktionieren, oder nicht? Was mache ich falsch oder wo liegt mein Denkfehler. Ich hoffe mal Ihr könnt mich erleuchten. Vielen Dank.

Mod-Edit: Code-Tags eingefügt ... evtl. fehlen Elemente wie [i] die als Formatierungsanweisung herausgenommen wurden.
 
Zuletzt bearbeitet von einem Moderator:
Also erst einmal möchte ich Dich bitten, Code immer in Code-Tags zu posten. Das geht am einfachsten über den Knopf </> links oberhalb des Eingabebereiches. (Ich habe Deinen Beitrag einmal editiert).

Das Problem an Deinem Code ist, dass Deine Schleife nie ausgeführt wird.
for(int i=zahlen.size(); i<0; i--)
i ist hier immer >= 0, da in der ArrayList nie eine negative Anzahl an Elementen sein kann. Daher wird in der Methode bei Dir nie etwas ausgeführt.

Wie kannst Du sowas selbst herausfinden?
Eine Möglichkeit ist das sogenannte Debugging. Du führst den Code einfach in einer Entwicklungsumgebung aus, die einen Debugger enthält. Das erlaubt Dir dann, den Code Schritt für Schritt durchzugehen.
Wenn Du keinen Debugger hast oder damit noch nicht umgehen kannst (und es noch nicht lernen willst), dann kannst Du so eine Art "Debugginging für Dummies" verwenden: Füge einfach viel mehr Ausgaben ein. Dann hast Du vor einer Schleife eine Ausgabe, in den Schleifen und den Blöcken einer If Anweisung Ausgaben u.s.w.. Dann siehst Du bei der Ausführung auch, was genau passiert.

Deine Lösungsidee ist aber ansonsten nicht wirklich korrekt. Wenn eine Zahl doppelt vorkommt, dann würde max mehrfach entfernt. Nach dem remove müsstest Du also z.B. aus der Schleife heraus gehen mittels break um ein mehrfaches löschen zu verhindern oder Du hast ein Check, der verhindert, dass ein Wert mehr als einmal gelöscht werden kann.

(Edit: Du willst ja die Schleife laufen lassen, so lange Elemente in der ArrayList sind. Also wäre die Bedingung i>0. Oder statt einer Zählschleife machst Du eine while Schleife: while(!zahlen.isEmpty()))
 
Hallo KonradN!

Zunächst mal herzlichen Dank für Deine ausführliche Antwort. Ich werde es mir natürlich zu Herzen nehmen und Code in Zukunft in Code-Tags packen. Und ich sehe schon, da hab ich wohl nicht nur einen Fehler in meinem Code...
Auf jeden Fall hab ich, Dank Deiner Antwort, ne ganze Menge gelernt.
 

Zurück
Oben