# Ausgabe einer "Grafik"



## André99 (18. Feb 2020)

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):   

```
++
                    ||
         _________||_________
          |   ___ ___ ___ ___  |
          |    |_| |_| |_| |_|   |
          |_________________|
          |_________________|
                (O)    (O)
```


----------



## abc66 (18. Feb 2020)

eh, pack diesen Zug doch mal in `[code]... Dein Zug ...[/code]`-Tags!


----------



## httpdigest (18. Feb 2020)

https://www.java-forum.org/thema/konkatenation-von-zwei-strings.187340/


----------



## André99 (18. Feb 2020)

abc66 hat gesagt.:


> eh, pack diesen Zug doch mal in `[code]... Dein Zug ...[/code]`-Tags!



Danke für den Hinweis, hab ich gemacht. Wird trotzdem etwas verrückt.


----------



## André99 (18. Feb 2020)

httpdigest hat gesagt.:


> https://www.java-forum.org/thema/konkatenation-von-zwei-strings.187340/


Danke!


----------



## abc66 (18. Feb 2020)

```
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);
}
```


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


----------



## André99 (18. Feb 2020)

abc66 hat gesagt.:


> ```
> public static void main(String[] args) {
> String train =
> "     ++      +------  ____________________\n"
> ...


Nochmals danke! Hilft mir sehr weiter, da ich die andere Lösung ungerne verwende, nicht das wir beide dann noch Plagiatsvorwürfe bekommen.


----------



## abc66 (18. Feb 2020)

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...


----------



## kneitzel (19. Feb 2020)

@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.


----------



## abc66 (19. Feb 2020)

JustNobody hat gesagt.:


> @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.)


Na ja, wegen der besseren Verständlichkeit? Micro Optimierungen ist die Wurzel des Bösen.


----------



## kneitzel (19. Feb 2020)

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.)


----------



## abc66 (19. Feb 2020)

"Gefällt mir nicht", ist eben kein Ausschlusskriterium. Aber gut, jeder darf seine Meinung kundtun.


----------



## mrBrown (19. Feb 2020)

abc66 hat gesagt.:


> "Gefällt mir nicht", ist eben kein Ausschlusskriterium. Aber gut, jeder darf seine Meinung kundtun.


Er hat Argumente gebracht, deine Aussagen sind auf der Ebene von „gefällt mir“.


----------



## abc66 (19. Feb 2020)

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


----------



## mrBrown (19. Feb 2020)

abc66 hat gesagt.:


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


Du schaffst es überaus gut, deinen Standpunkt nicht zu erwähnen.

Das, was @JustNobody erwähnelt, würde den Code nur einfacher verständlich machen.


----------



## kneitzel (19. Feb 2020)

abc66 hat gesagt.:


> "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.



abc66 hat gesagt.:


> 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:

```
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?

```
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.


----------



## abc66 (19. Feb 2020)

Dann müsste hier


abc66 hat gesagt.:


> String[] newTrain = a;


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.


----------



## kneitzel (19. Feb 2020)

abc66 hat gesagt.:


> 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:

```
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.


----------

