projekt 1 code schöner schreiben.

Bitte aktiviere JavaScript!
Kann mir einer erklären wie ich den Code schöner schreiben kann?
ich weiß dass else bedinungen nicht schön sein sollen, daher würde ich das gerne ändern
Java:
for (int j = 0; j < max[1]; j++) {
            for (int i = 0; i < max[0]; i++) {
                System.out.println(i + "," + j + ": " + get(marsKarte, new int[] { i, j }));

                if (get(marsKarte, new int[] { i, j }) == null) {
                    System.out.print(" ");
                    continue;
                }
                if (get(marsKarte, new int[] { i, j }).equals("#"))
                    System.out.print("#");
                else if (get(marsKarte, new int[] { i, j }).equals("n"))
                    System.out.print("^");
                else if (get(marsKarte, new int[] { i, j }).equals("s"))
                    System.out.print("V");
                else if (get(marsKarte, new int[] { i, j }).equals("e"))
                    System.out.print(">");
                if (get(marsKarte, new int[] { i, j }).equals("w"))
                    System.out.print("<");

            }
            System.out.println();
        }

//Gesamter Code des programmes
package rover;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;

public class Start {
    
    static Random r = new Random();
    static LinkedHashMap<int[], String> marsKarte;
    static int BREITE_MARSES = 80;                         
    static int HOEHE_MARSES = 20;           
    static int ROVER_XPOSITION = BREITE_MARSES / 2;   
    static int ROVER_YPOSITION = HOEHE_MARSES / 2;

    public static void erstelleKarteUndSetzeRoverInDieMitte() {
        marsKarte = new LinkedHashMap<>();
        
        for (int i = 0; i < BREITE_MARSES; i++) {
            for (int j = 0; j < HOEHE_MARSES; j++) {
                int[] positionVomHindernis = new int[] { i, j };
                if (r.nextDouble() < 0.25 && !(ROVER_XPOSITION == i && ROVER_YPOSITION == j))
                    marsKarte.put(positionVomHindernis, "#"); //Füge zur LinkedHashMap die Position auf der sich ein Hindernis befindet.
            }
        }
        marsKarte.put(new int[] {ROVER_XPOSITION , ROVER_YPOSITION }, "n"); //Erzeuge den Roboter auf den jeweiligen Positionen
    }   
    
    
    
    
    public static int[] maximum(Set<int[]> set) {
        int[] x = new int[2];
        for (int[] e : set) {
            if (e[0] > x[0])
                x[0] = e[0];
            if (e[1] > x[1])
                x[1] = e[1];
        }
        return x;
    }

    public static String get(Map<int[], String> kloetze, int[] p) {
        Set<Entry<int[], String>> entrySet = kloetze.entrySet();
        for (Entry<int[], String> entry : entrySet) {
            if (entry.getKey()[0] == p[0] && entry.getKey()[1] == p[1])
                return entry.getValue();
        }
        return null;
    }

    public static void printeDasFeld() {
        fehlerAbfangen();
        
        int[] max = maximum(marsKarte.keySet());
        for (int j = 0; j < max[1]; j++) {
            for (int i = 0; i < max[0]; i++) {
                System.out.println(i + "," + j + ": " + get(marsKarte, new int[] { i, j }));

                if (get(marsKarte, new int[] { i, j }) == null) {
                    System.out.print(" ");
                    continue;
                }
                if (get(marsKarte, new int[] { i, j }).equals("#"))
                    System.out.print("#");
                else if (get(marsKarte, new int[] { i, j }).equals("n"))
                    System.out.print("^");
                else if (get(marsKarte, new int[] { i, j }).equals("s"))
                    System.out.print("V");
                else if (get(marsKarte, new int[] { i, j }).equals("e"))
                    System.out.print(">");
                if (get(marsKarte, new int[] { i, j }).equals("w"))
                    System.out.print("<");

            }
            System.out.println();
        }
        
        ausgabeAbgrenzungVomMars(max); //Die Codebefehle hab ich in eine neue Methode geändert.
    }
    
    public static void ausgabeAbgrenzungVomMars(int[] max){
        for (int i = 0; i < max[0]; i++) {  //Dient zur Trennung und Abgrenzung der unteren und oberen Grenze der Marskarte
            System.out.print("=");
        }
        System.out.println();
        
        
    }
    
    public static void fehlerAbfangen(){
        Set<int[]> keySet = marsKarte.keySet();
        for (int[] e : keySet) {
          if (e[0] == 39 && e[1] == 10)
          System.err.println(marsKarte.get(e) + " " + e.hashCode());
        }
    
    }
    

    
    

    public static void main(String[] args) {

        if (args.length > 1) {
            long seed = Long.parseLong(args[1]);
            r.setSeed(seed);
            // System.out.println("Seed: " + seed);
        }
        erstelleKarteUndSetzeRoverInDieMitte();
        String pg = args[0];
        printeDasFeld();
        for (int i = 0; i < pg.length(); i++) {
            make(pg.charAt(i));
            printeDasFeld();
        }
    }

    public static void make(char c) {
        if (c == 'f') {
            int[] p = findeRover();
            if (get(marsKarte, p).equals("n"))
                p[1]--;
            else if (get(marsKarte, p).equals("s"))
                p[1]++;
            else if (get(marsKarte, p).equals("e"))
                p[0]++;
            else if (get(marsKarte, p).equals("w"))
                p[0]--;
        } else if (c == 'b') {
            int[] p = findeRover();
            if (get(marsKarte, p).equals("s"))
                p[1]--;
            else if (get(marsKarte, p).equals("n"))
                p[1]++;
            else if (get(marsKarte, p).equals("w"))
                p[0]++;
            else if (get(marsKarte, p).equals("e"))
                p[0]--;
        } else if (c == 'l') {
            int[] p = findeRover();
            if (get(marsKarte, p).equals("n"))
                marsKarte.put(p, "w");
            else if (get(marsKarte, p).equals("s"))
                marsKarte.put(p, "e");
            else if (get(marsKarte, p).equals("e"))
                marsKarte.put(p, "n");
            else if (get(marsKarte, p).equals("w"))
                marsKarte.put(p, "s");
        } else if (c == 'r') {
            int[] p = findeRover();
            if (get(marsKarte, p).equals("w"))
                marsKarte.put(p, "n");
            else if (get(marsKarte, p).equals("e"))
                marsKarte.put(p, "s");
            else if (get(marsKarte, p).equals("n"))
                marsKarte.put(p, "e");
            else if (get(marsKarte, p).equals("s"))
                marsKarte.put(p, "w");
        }

    }

    private static int[] findeRover() {
        Set<Entry<int[], String>> entrySet = marsKarte.entrySet();
        for (Entry<int[], String> entry : entrySet) {
            if (entry.getValue() != null && !entry.getValue().equals("#"))
                return entry.getKey();
        }
        throw new IllegalStateException("Rover missing in action");
    }

}
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
Also meine Anmerkungen dazu wären:
a) Einheitliche Namen! Beispiel: Mal ist es eine Karte (marsKarte) und dann hast Du in einer Funktion Kloetze?
b) Nutzung von Funktionen: Die Funktion get bekommt die Map und ein int array. Aber bei jedem Aufruf erzeugst du ein neues int array aus zwei Werten. Da macht es dann doch Sinn, das in die Funktion mit rein zu nehmen (so notwendig). Aber wenn Du in der Funktion aber nur die einzelnen Werte benötigst, dann musst Du auch nicht erst ein solches Array bauen.
c) Thema Namen hatten wir doch schon. i, j, p, ... Das besagt absolut nichts aus.
d) Nochmal Namen: Entscheide Dich für eine Sprache! printField (Englisch) oder feldAusgeben (Deutsch), aber printeDasFeld?
e) Schau Dir die Klassen an, die Du benutzt! Was für Funktionen bietet eine Map? Was für Funktionen bietet ein Set?
f) Teilweise ist es oben schon angeklungen: Doppelter Code ist schlecht. Das sollte immer vermieden werden. Ein weiteres Beispiel bei Dir ist die Funktion make: In jedem if Zweig wird sucheRover aufgerufen. Zieh den Aufruf vor das erste if und Du hast ihn nur noch ein einziges Mal. Das Funktioniert auch mit Aufrufen innerhalb eines ifs. Also statt in jedem if ... else if .. else if ... immer get aufzurufen, rufst Du es doch lieber nur einmal auf.
g) Schau Dir mal das switch statement von Java an. Wenn Du eine Variable / Rückgabe prüfen willst auf verschiedene Werte, dann bietet sich die switch Anweisung an. Diese ist deutlich übersichtlicher.

Das sollte für den Anfang rest einmal reichen, oder?
 
Also meine Anmerkungen dazu wären:
a) Einheitliche Namen! Beispiel: Mal ist es eine Karte (marsKarte) und dann hast Du in einer Funktion Kloetze?
b) Nutzung von Funktionen: Die Funktion get bekommt die Map und ein int array. Aber bei jedem Aufruf erzeugst du ein neues int array aus zwei Werten. Da macht es dann doch Sinn, das in die Funktion mit rein zu nehmen (so notwendig). Aber wenn Du in der Funktion aber nur die einzelnen Werte benötigst, dann musst Du auch nicht erst ein solches Array bauen.
c) Thema Namen hatten wir doch schon. i, j, p, ... Das besagt absolut nichts aus.
d) Nochmal Namen: Entscheide Dich für eine Sprache! printField (Englisch) oder feldAusgeben (Deutsch), aber printeDasFeld?
e) Schau Dir die Klassen an, die Du benutzt! Was für Funktionen bietet eine Map? Was für Funktionen bietet ein Set?
f) Teilweise ist es oben schon angeklungen: Doppelter Code ist schlecht. Das sollte immer vermieden werden. Ein weiteres Beispiel bei Dir ist die Funktion make: In jedem if Zweig wird sucheRover aufgerufen. Zieh den Aufruf vor das erste if und Du hast ihn nur noch ein einziges Mal. Das Funktioniert auch mit Aufrufen innerhalb eines ifs. Also statt in jedem if ... else if .. else if ... immer get aufzurufen, rufst Du es doch lieber nur einmal auf.
g) Schau Dir mal das switch statement von Java an. Wenn Du eine Variable / Rückgabe prüfen willst auf verschiedene Werte, dann bietet sich die switch Anweisung an. Diese ist deutlich übersichtlicher.

Das sollte für den Anfang rest einmal reichen, oder?
es geht nur um die Methode die ich erwähnt habe, also danach gehe ich zu den anderen Methoden. will das schritt für schritt abarbeiten. Also ich fange mit der methhode an. Dann schicke ich dir den neuen code dann überprüfst.
 
Also meine Anmerkungen dazu wären:
a) Einheitliche Namen! Beispiel: Mal ist es eine Karte (marsKarte) und dann hast Du in einer Funktion Kloetze?
b) Nutzung von Funktionen: Die Funktion get bekommt die Map und ein int array. Aber bei jedem Aufruf erzeugst du ein neues int array aus zwei Werten. Da macht es dann doch Sinn, das in die Funktion mit rein zu nehmen (so notwendig). Aber wenn Du in der Funktion aber nur die einzelnen Werte benötigst, dann musst Du auch nicht erst ein solches Array bauen.
c) Thema Namen hatten wir doch schon. i, j, p, ... Das besagt absolut nichts aus.
d) Nochmal Namen: Entscheide Dich für eine Sprache! printField (Englisch) oder feldAusgeben (Deutsch), aber printeDasFeld?
e) Schau Dir die Klassen an, die Du benutzt! Was für Funktionen bietet eine Map? Was für Funktionen bietet ein Set?
f) Teilweise ist es oben schon angeklungen: Doppelter Code ist schlecht. Das sollte immer vermieden werden. Ein weiteres Beispiel bei Dir ist die Funktion make: In jedem if Zweig wird sucheRover aufgerufen. Zieh den Aufruf vor das erste if und Du hast ihn nur noch ein einziges Mal. Das Funktioniert auch mit Aufrufen innerhalb eines ifs. Also statt in jedem if ... else if .. else if ... immer get aufzurufen, rufst Du es doch lieber nur einmal auf.
g) Schau Dir mal das switch statement von Java an. Wenn Du eine Variable / Rückgabe prüfen willst auf verschiedene Werte, dann bietet sich die switch Anweisung an. Diese ist deutlich übersichtlicher.

Das sollte für den Anfang rest einmal reichen, oder?
Beispiel: eliminiere mehrfach auftretenden Code; get(marsKarte, new int[] { i, j }) taucht x-fach auf.


Da weißt Du was anderes als ich. Du meinst if-else-Kaskaden. Die können oft mit einer Map vermieden werden.
ich habe dafür schon switch anweisun gverwendet also sieht schöner aus. Mein problmen wäre eigentlich das maximum
 
Kann mir einer erklären wie ich den Code schöner schreiben kann?
ich weiß dass else bedinungen nicht schön sein sollen, daher würde ich das gerne ändern
Java:
for (int j = 0; j < max[1]; j++) {
            for (int i = 0; i < max[0]; i++) {
                System.out.println(i + "," + j + ": " + get(marsKarte, new int[] { i, j }));

                if (get(marsKarte, new int[] { i, j }) == null) {
                    System.out.print(" ");
                    continue;
                }
                if (get(marsKarte, new int[] { i, j }).equals("#"))
                    System.out.print("#");
                else if (get(marsKarte, new int[] { i, j }).equals("n"))
                    System.out.print("^");
                else if (get(marsKarte, new int[] { i, j }).equals("s"))
                    System.out.print("V");
                else if (get(marsKarte, new int[] { i, j }).equals("e"))
                    System.out.print(">");
                if (get(marsKarte, new int[] { i, j }).equals("w"))
                    System.out.print("<");

            }
            System.out.println();
        }

//Gesamter Code des programmes
package rover;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;

public class Start {
   
    static Random r = new Random();
    static LinkedHashMap<int[], String> marsKarte;
    static int BREITE_MARSES = 80;                        
    static int HOEHE_MARSES = 20;          
    static int ROVER_XPOSITION = BREITE_MARSES / 2;  
    static int ROVER_YPOSITION = HOEHE_MARSES / 2;

    public static void erstelleKarteUndSetzeRoverInDieMitte() {
        marsKarte = new LinkedHashMap<>();
       
        for (int i = 0; i < BREITE_MARSES; i++) {
            for (int j = 0; j < HOEHE_MARSES; j++) {
                int[] positionVomHindernis = new int[] { i, j };
                if (r.nextDouble() < 0.25 && !(ROVER_XPOSITION == i && ROVER_YPOSITION == j))
                    marsKarte.put(positionVomHindernis, "#"); //Füge zur LinkedHashMap die Position auf der sich ein Hindernis befindet.
            }
        }
        marsKarte.put(new int[] {ROVER_XPOSITION , ROVER_YPOSITION }, "n"); //Erzeuge den Roboter auf den jeweiligen Positionen
    }  
   
   
   
   
    public static int[] maximum(Set<int[]> set) {
        int[] x = new int[2];
        for (int[] e : set) {
            if (e[0] > x[0])
                x[0] = e[0];
            if (e[1] > x[1])
                x[1] = e[1];
        }
        return x;
    }

    public static String get(Map<int[], String> kloetze, int[] p) {
        Set<Entry<int[], String>> entrySet = kloetze.entrySet();
        for (Entry<int[], String> entry : entrySet) {
            if (entry.getKey()[0] == p[0] && entry.getKey()[1] == p[1])
                return entry.getValue();
        }
        return null;
    }

    public static void printeDasFeld() {
        fehlerAbfangen();
       
        int[] max = maximum(marsKarte.keySet());
        for (int j = 0; j < max[1]; j++) {
            for (int i = 0; i < max[0]; i++) {
                System.out.println(i + "," + j + ": " + get(marsKarte, new int[] { i, j }));

                if (get(marsKarte, new int[] { i, j }) == null) {
                    System.out.print(" ");
                    continue;
                }
                if (get(marsKarte, new int[] { i, j }).equals("#"))
                    System.out.print("#");
                else if (get(marsKarte, new int[] { i, j }).equals("n"))
                    System.out.print("^");
                else if (get(marsKarte, new int[] { i, j }).equals("s"))
                    System.out.print("V");
                else if (get(marsKarte, new int[] { i, j }).equals("e"))
                    System.out.print(">");
                if (get(marsKarte, new int[] { i, j }).equals("w"))
                    System.out.print("<");

            }
            System.out.println();
        }
       
        ausgabeAbgrenzungVomMars(max); //Die Codebefehle hab ich in eine neue Methode geändert.
    }
   
    public static void ausgabeAbgrenzungVomMars(int[] max){
        for (int i = 0; i < max[0]; i++) {  //Dient zur Trennung und Abgrenzung der unteren und oberen Grenze der Marskarte
            System.out.print("=");
        }
        System.out.println();
       
       
    }
   
    public static void fehlerAbfangen(){
        Set<int[]> keySet = marsKarte.keySet();
        for (int[] e : keySet) {
          if (e[0] == 39 && e[1] == 10)
          System.err.println(marsKarte.get(e) + " " + e.hashCode());
        }
   
    }
   

   
   

    public static void main(String[] args) {

        if (args.length > 1) {
            long seed = Long.parseLong(args[1]);
            r.setSeed(seed);
            // System.out.println("Seed: " + seed);
        }
        erstelleKarteUndSetzeRoverInDieMitte();
        String pg = args[0];
        printeDasFeld();
        for (int i = 0; i < pg.length(); i++) {
            make(pg.charAt(i));
            printeDasFeld();
        }
    }

    public static void make(char c) {
        if (c == 'f') {
            int[] p = findeRover();
            if (get(marsKarte, p).equals("n"))
                p[1]--;
            else if (get(marsKarte, p).equals("s"))
                p[1]++;
            else if (get(marsKarte, p).equals("e"))
                p[0]++;
            else if (get(marsKarte, p).equals("w"))
                p[0]--;
        } else if (c == 'b') {
            int[] p = findeRover();
            if (get(marsKarte, p).equals("s"))
                p[1]--;
            else if (get(marsKarte, p).equals("n"))
                p[1]++;
            else if (get(marsKarte, p).equals("w"))
                p[0]++;
            else if (get(marsKarte, p).equals("e"))
                p[0]--;
        } else if (c == 'l') {
            int[] p = findeRover();
            if (get(marsKarte, p).equals("n"))
                marsKarte.put(p, "w");
            else if (get(marsKarte, p).equals("s"))
                marsKarte.put(p, "e");
            else if (get(marsKarte, p).equals("e"))
                marsKarte.put(p, "n");
            else if (get(marsKarte, p).equals("w"))
                marsKarte.put(p, "s");
        } else if (c == 'r') {
            int[] p = findeRover();
            if (get(marsKarte, p).equals("w"))
                marsKarte.put(p, "n");
            else if (get(marsKarte, p).equals("e"))
                marsKarte.put(p, "s");
            else if (get(marsKarte, p).equals("n"))
                marsKarte.put(p, "e");
            else if (get(marsKarte, p).equals("s"))
                marsKarte.put(p, "w");
        }

    }

    private static int[] findeRover() {
        Set<Entry<int[], String>> entrySet = marsKarte.entrySet();
        for (Entry<int[], String> entry : entrySet) {
            if (entry.getValue() != null && !entry.getValue().equals("#"))
                return entry.getKey();
        }
        throw new IllegalStateException("Rover missing in action");
    }

}
ich meinte die Methode maximum, ich verstehe nicht genau was sie machen soll?
 
Du hast eine Methode namens "maximum", diese nimmt eine Menge von Koordinaten entgegen und gibt eine Koordinate zurück. Was würdest Du denn erwarten, welche Funktion diese Methode nun durchführt?
 
Du hast eine Methode namens "maximum", diese nimmt eine Menge von Koordinaten entgegen und gibt eine Koordinate zurück. Was würdest Du denn erwarten, welche Funktion diese Methode nun durchführt?
Also dieses Maximum hat stark irritiert. Und die if bedinung. Das mit den Koordinaten hab ich verstanden aber das hilft nicht weiter was genau der Code macht. Er kriegt halt die i j als Koordinate übergebend die wir gesetzt haben.
 
Beantworte halt einfach mal meine Frage. Ohne in den Code zu schauen: was würdest Du von einer solchen Methode erwarten?
 
Du erwartest von einer Funktion, die Dir eine Koordinate liefert, dass sie dort die maximale Anzahl der Koordinaten zurückgibt?!?
Nein sondern wie Weit die Koordinaten gehen bzw. Der es gibt einen Wert in dem array x uns wenn dieser Wert kleiner ist als der Wert von unserer Koordinate dann wird unsere Koordinate zu dem x wert.
So gesehen ist er sowas wie eine Mauer das sagt nein halt stop hier nicht weiter!
 
Also irgendwie habe ich Verständnisprobleme.

a) Die Größe der Karte hast Du ja in zwei Variablen. Daher ist das doch nicht mehr zu berechnen....
b) Leere Felder werden nicht gefüllt. Beim initialisieren werden lediglich die Hindernisse oder so gesetzt sowie der Rover. (Dabei kann der Rover auf de gleichen Feld sein wie ein Hindernis!) Es kann also sein, dass in der letzten Zeile oder Spalte kein Hindernis ist und damit wäre dann die Ausgabe ohne die leere Zeile oder Spalte.

Aber meine Bedenken bezüglich der Datenspeicherung habe ich ja bereits kund getan bezüglich Vergleich von int arrays und so.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben