Ausgabe einer "Grafik"

André99

Mitglied
Hey,
unsere Aufgabe ist es momentan, ein Schienennetz mit Zügen zu implementieren. Es gibt unter anderem eine Methode, die die Züge grafisch ausgeben soll. Ich habe jetzt dafür ein Array angelegt und jede Zeile des Zugs ist eine Position im Array. Da es einige Züge sind und es etwas umständlich ist so zu arbeiten, wollte ich Fragen, ob jemand eine einfachere Methode kennt, dass Ganze auszugeben. Wir dürfen nur die Pakete java.lang, java.util, java.util.regex, java.util.function und java.util.stream benutzen.

Sieht dann etwa so aus (Wird etwas verrückt):
Code:
                   ++
                    ||
         _________||_________
          |   ___ ___ ___ ___  |
          |    |_| |_| |_| |_|   |
          |_________________|
          |_________________|
                (O)    (O)
 
Zuletzt bearbeitet:

abc66

Top Contributor
Java:
public static void main(String[] args) {
	String train = 
			  "     ++      +------  ____________________\n"
			+ "     ||      |+-+ |   |  ___ ___ ___ ___ |\n"
		    + "   /---------|| | |   |  |_| |_| |_| |_| |\n"
			+ "  + ========  +-+ |   |__________________|\n"
		    + " _|--/~\\\\------/~\\\\-++|__________________|\n"
			+ "//// \\\\_/      \\\\_/      (O)        (O)   \n";

	String[] a = train.split("\n");
	String[] b = train.split("\n");
	for (int i = 0; i < a.length; i++) {
		a[i] = a[i].substring(0, 21);
		b[i] = b[i].substring(21);
	}

	String[] newTrain = a;
	final int n = 5;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < newTrain.length; j++) {
			newTrain[j] += b[j];
		}
	}

	String s = "";
	for (int i = 0; i < newTrain.length; i++) {
		s += newTrain[i] + System.lineSeparator();
	}
	System.out.println(s);
}

Code:
     ++      +------  ____________________ ____________________ ____________________ ____________________ ____________________
     ||      |+-+ |   |  ___ ___ ___ ___ | |  ___ ___ ___ ___ | |  ___ ___ ___ ___ | |  ___ ___ ___ ___ | |  ___ ___ ___ ___ |
   /---------|| | |   |  |_| |_| |_| |_| | |  |_| |_| |_| |_| | |  |_| |_| |_| |_| | |  |_| |_| |_| |_| | |  |_| |_| |_| |_| |
  + ========  +-+ |   |__________________| |__________________| |__________________| |__________________| |__________________|
 _|--/~\\------/~\\-++|__________________|+|__________________|+|__________________|+|__________________|+|__________________|
//// \\_/      \\_/      (O)        (O)       (O)        (O)       (O)        (O)       (O)        (O)       (O)        (O)
 

André99

Mitglied
Java:
public static void main(String[] args) {
    String train =
              "     ++      +------  ____________________\n"
            + "     ||      |+-+ |   |  ___ ___ ___ ___ |\n"
            + "   /---------|| | |   |  |_| |_| |_| |_| |\n"
            + "  + ========  +-+ |   |__________________|\n"
            + " _|--/~\\\\------/~\\\\-++|__________________|\n"
            + "//// \\\\_/      \\\\_/      (O)        (O)   \n";

    String[] a = train.split("\n");
    String[] b = train.split("\n");
    for (int i = 0; i < a.length; i++) {
        a[i] = a[i].substring(0, 21);
        b[i] = b[i].substring(21);
    }

    String[] newTrain = a;
    final int n = 5;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < newTrain.length; j++) {
            newTrain[j] += b[j];
        }
    }

    String s = "";
    for (int i = 0; i < newTrain.length; i++) {
        s += newTrain[i] + System.lineSeparator();
    }
    System.out.println(s);
}

Code:
     ++      +------  ____________________ ____________________ ____________________ ____________________ ____________________
     ||      |+-+ |   |  ___ ___ ___ ___ | |  ___ ___ ___ ___ | |  ___ ___ ___ ___ | |  ___ ___ ___ ___ | |  ___ ___ ___ ___ |
   /---------|| | |   |  |_| |_| |_| |_| | |  |_| |_| |_| |_| | |  |_| |_| |_| |_| | |  |_| |_| |_| |_| | |  |_| |_| |_| |_| |
  + ========  +-+ |   |__________________| |__________________| |__________________| |__________________| |__________________|
_|--/~\\------/~\\-++|__________________|+|__________________|+|__________________|+|__________________|+|__________________|
//// \\_/      \\_/      (O)        (O)       (O)        (O)       (O)        (O)       (O)        (O)       (O)        (O)
Nochmals danke! Hilft mir sehr weiter, da ich die andere Lösung ungerne verwende, nicht das wir beide dann noch Plagiatsvorwürfe bekommen.
 

abc66

Top Contributor
Ach keine Bange, ich fechte deine Arbeit nicht an und ich selber muss auch keine Züge in einer Arbeit zeichnen. ;)
Es werden hier also wahrscheinlich niemandes Rechte verletzt.
Außerdem betrifft dich der wissenschaftliche "Kodex" ja noch nicht. ; ) Redlichkeit usw...
 
K

kneitzel

Gast
@abc Warum machst du den split 2 Mal? Das ist doch unnötig. Du kannst das Array b einfach als neues Array mit der gleichen Größe wie a erstellen.
(Und dann natürlich erst b zuweisen ehe Du a veränderst.)

Aber warum a und b? Warum keine sinnvollen Namen? Da hat man erst einmal zeilenGanzerZug und dann zeilenLok und zeilenWagon. Ich hätte also noch ein weiteres Array verwendet. Denn was ist in a bzw. b? Das ist jetzt abhängig vom Ort. Das sind ja erst die Zeilen vom ganzen Zug und dann die Zeilen der Lok bzw. des Wagens. Das ist zumindest in meinen Augen unschön.
 
K

kneitzel

Gast
Das wäre aus meiner Sicht keine Optimierung, denn Du fängst ja bereits mit einer Optimierung an, indem Du Variablen doppelt belegst. Vor der Schleife ist der Inhalt anders als nach der Schleife. (Und Inhalt bezeichnet nicht den Wert selbst sondern die Klassifizierung. Inhalt kann sich ändern, also z.B. ändert sich der Füllstand eines Tanks in einem Auto, wenn der Motor an ist. Aber es ist immer der Füllstand des Autos und immer in der gleichen Masseinheit. Also da ist nicht mal der Inhalt in % und mal in Litern enthalten.)
 
K

kneitzel

Gast
"Gefällt mir nicht", ist eben kein Ausschlusskriterium. Aber gut, jeder darf seine Meinung kundtun.
Selbstverständlich sind wir hier in einem Bereich dem ich ich als Clean Code umschreiben würde und da kann jeder die Meinung haben, die er haben möchte:
a) Wenn du Variablen als a, b, c, d, ... benennen willst
b) Du in eine Variable nacheinander unterschiedliche Dinge stecken willst
dann ist das für mich vollkommen ok. Ich will Dir hier keinerlei Vorgaben machen. Ich will Dich nicht einmal überzeugen!

Ich erlaube mir hier nur, einen Verbesserungsvorschlag zu unterbreiten. Dieser beruht selbstverständlich auf meiner pers. Sicht.

Und nun kann hier jeder - vor allem die Anfänger - jeder für sich überlegen, was er besser findet.

Es würde aber 0 bringen, ihm eine Lösung zu schreiben, die er noch nicht versteht. Das mein Standpunkt. ;)

Eine Lösung, bei der die Variablen nicht a, b, ... heissen und einen klar definierten Inhalt haben, ist also schwerer zu verstehen in Deinen Augen?

Also statt:
Code:
    String[] a = train.split("\n");
    String[] b = train.split("\n");
    for (int i = 0; i < a.length; i++) {
        a[i] = a[i].substring(0, 21);
        b[i] = b[i].substring(21);
    }

ist das deutlich schwerer zu verstehen?
Code:
    String[] trainLines = train.split("\n");
    String[] locoLines = String[trainLines.length];
    String[] wagonLines = String[trainLines.length];
    for (int i = 0; i < a.length; i++) {
        locoLines[i] = trainLines[i].substring(0, 21);
        wagonLines [i] = trainLines[i].substring(21);
    }

Davon abgesehen würde ich die 21 noch in eine Konstante ziehen, die dann bei der Variable train zu finden ist.
 
K

kneitzel

Gast
Dann müsste hier

aber auch ein neues Array erstellt werden, anstatt a weiterzuverwenden.

Alles Maßnahmen, die die Lesbarkeit nicht unbedingt verbessern. Und ja, a und b finde ich im Kontext etwas leichter zu lesen.
Die Stelle mit dem newTrain trifft dies sogar noch deutlich mehr! Das ist tatsächlich noch deutlich fataler:
Du hast dann ja zwei Variablen, die auf ein Array referenzieren. Änderungen am newTrain sind da ja auch in a, was in meinen Augen durchaus als fatal anzusehen sind. Das ist ja nicht zwingend etwas, womit man rechnet.

Wenn man den ganzen Code betrachtet, dann würde ich da also eher zu etwas wie:
Code:
public static void main(String[] args) {
    String train =
              "     ++      +------  ____________________\n"
            + "     ||      |+-+ |   |  ___ ___ ___ ___ |\n"
            + "   /---------|| | |   |  |_| |_| |_| |_| |\n"
            + "  + ========  +-+ |   |__________________|\n"
            + " _|--/~\\\\------/~\\\\-++|__________________|\n"
            + "//// \\\\_/      \\\\_/      (O)        (O)   \n";
    final int endOfTrain = 21;
    
    String[] trainLines = train.split("\n");
    String[] waggonLines = new String[trainLines.length];
    for (int i = 0; i < trainLines.length; i++) {
        waggonLines[i] = trainLines[i].substring(21);
    }

    final int numWaggons = 5;
    for (int i = 1; i < numWaggons; i++) {
        for (int lineNr = 0; lineNr < trainLines.length; lineNr++) {
            trainLines[lineNr] += waggonLines[lineNr];
        }
    }

    String result = "";
    for (int lineNr = 0; lineNr < trainLines.length; lineNr++) {
        result += trainLines[lineNr] + System.lineSeparator();
    }
    System.out.println(result);
}

Wobei hier noch anzumerken ist, dass ich hier explizit StringBuilder nicht verwendet habe - in Schleifen wäre das aus meiner Sicht aber auch die übliche Herangehensweise. Ebenso wäre hier eine Unterteilung in Methoden denkbar, die alles leserlicher machen würde. Nur hier geht es um eine Anfängeraufgabe und daher habe ich darauf verzichtet und das wäre aus meiner Sicht wohl das, was ich am ehesten als "Musterlösung" ansehen würde.
 

Neue Themen


Oben