Dreieck effektiv auf Konsole ausgeben

Machen wir das doch etwas effektivier:

        while (ca.length < 10) {
            Arrays.fill(ca, 'x');
            System.out.println(String.valueOf(ca));
            ca = new char[ca.length + 1];
        }
        while (ca.length > 0) {
            Arrays.fill(ca, 'x');
            System.out.println(String.valueOf(ca));
            ca = new char[ca.length - 1];
        }```

Das erzeugt:


run:
x
xx
xxx
xxxx
xxxxx
xxxxxx
xxxxxxx
xxxxxxxx
xxxxxxxxx
xxxxxxxxxx
xxxxxxxxx
xxxxxxxx
xxxxxxx
xxxxxx
xxxxx
xxxx
xxx
xx
x
BUILD SUCCESSFUL (total time: 0 seconds)



(Werbung von der IDE ignorieren)

Es gibt leider keine Möglichkeit, einen String zu erstellen, ohne das das basis Array kopiert werden müsste. An den String pool kommt auch glaube ich nur über String-Konstanten heran.

Ich habe immer noch nicht kapiert, wofür eine Do-While-Schleife (fußgesteuert) da ist, wenn eine in ihr deklarierte Variable nicht im Schleifenfuß sichtbar ist...

*** Edit ***

Sorry, ist das von der Performance her besser?:

```        final char[] ca = new char[10];
        Arrays.fill(ca, 'x');
        int i = 1;
        for (; i < 10; i++) {
            System.out.println(String.valueOf(ca, 0, i));
        }
        for (; i > 0; i--) {
            System.out.println(String.valueOf(ca, 0, i));
        }```

(Know your api, i know...)

(Tomate_Salat: abgetrennt von diesem [Thema](http://forum.byte-welt.net/threads/11892-Frage-wegen-while-Schleife), da es nichts mit dem Problem des TOs zu tun hatte)

Deins funktioniert auch aber sowas wie final char oder Array.fill hatte ich noch nicht deshalb kann ich damit weniger anfangen. Danke trotzdem (:

@CyborgBeta
Der TO hatte lediglich Verständnisprobleme bei dem Überladenen “+”-Operator, wozu benötigt er deiner Meinung nach zwei andere Beispiele, die ein völlig anderes Muster auf die Konsole zeichnen?

Performancediskussionen zu solchen Übungsbeispielen sind auch ziemlich sinnfrei.
Im Zweifelsfall nehm für die Lesbarkeit einen StringBuilder/StringBuffer und lass den das Arraygeschubse hinter den Konkatenationen oder Substrings erledigen.

Zu der DO-While kannst du dir eigentlich mal selber Gedanken machen.
Erster Ansatz: Was unterscheidet die do-while von einer while-Schleife und wann kann man sie verwenden um Code-Redundanz zu vermeiden?
Zweiter Ansatz: Hast du bei der do-while wirklich einen anderen Scope als bei einer while, nur weil du eine Variable in der Schleifenbedingung verwenden willst?

Hm, ich wurde angegriffen oder? Ein StringBuilder ist nicht schneller und ein StringBuffer ist wegen Threadsicherheit noch langsamer als Builder. Wenn du nur falsche Antworten gibst, dann solltest du vielleicht keine Behauptungen aufstellen und mir unterstellen, ich würde ihm nicht helfen. Kopfschütteln.

*** Edit ***

Hm, ich wollte die Antwort von FP komplett auseinander nehmen, aber zwischenzeitlich ist die Zeit zum Editieren abgelaufen und mein Text ist weg, jetzt habe ich keine Lust mehr, alles noch mal zu schreiben.

Auch gut wäre (weil es ein Dreieck-Muster ist, zu dessen Länge und Ausrichtung gar nichts gesagt wurde, und weil es der auf der String-Konkatenation folgende Schritt ist, einen String auch anders, aber nicht innerhalb einer zweiten Schleife in einer Schleife durch Erstellung eines neuen, langsameren StringBuilder s und .append()- (und .toString()-)Aufrufe zu erstellen, und weil performancebeachtende Programmierung per se “richtige” Programmierung und für einen Anfänger nicht verkehrt ist):

        Arrays.fill(ca, 'x');
        for (int i = 0; i >= 0; i++) {
            System.out.println(String.valueOf(ca, 0, i%18 < 10 ? i%18 + 1 : 19 - i%18) );
        }```

*** Edit ***

Gleiches Muster ist auf hiermit möglich (jetzt können sich alle freuen, die im Palindrom-Jahr 1881 geboren wurden), aber der ternäre Operator wurde eigentlich nur in eine andere Methode ausgelagert:

```        final char[] ca = new char[10];
        Arrays.fill(ca, 'x');
        for (int i = 0; i >= 0; i++) {
            System.out.println(String.valueOf(ca, 0, Math.abs(i%18-8)+1 ));
        }```

und weil performancebeachtende Programmierung per se „richtige“ Programmierung […] ist

Dem wage ich zu widersprechen. Man sollte die Performence höchstens bei der Wahl eines Algorithmus beachten, nicht aber bei Kleinkram.

premature optimization is the root of all evil

Wenn eine Anwendung wirklich zu langsam ist, sollte man mit einem Profiler herangehen und den Flaschenhals überarbeiten. Alle sonstige Optimierung geht in der Regel auf Kosten des schnellen Verständnisses und der Wartbarkeit des Codes und verursacht Kosten.

Gerade Anfänger sollten sich nicht damit auseinandersetzen. Im Fall, um den es hier geht, kannst du optimieren wie du willst, der Flaschenhals ist die Ausgabe auf die Konsole.

Dont feed the troll.

Das steht im falschen Kontext, ist unbrauchbar und kann deshalb weg, führt euch selber vor, Lästerschwestern. Komisch, das gerade, nachdem ich gefragt hatte, ob alte von mir eröffnete Themen in die Tonne können, ihr ein neues Thema abspaltet und eröffnet. Und naja btw. … Wenn zeilenweise über println ausgegeben werden soll, ist es die beste Implementierung. Beste ist ein Superlativ und bedeute so viel wie, das es keine bessere Implementierung gibt. Fangt wieder an zu haten bitte stört mich nicht.

Bin ich der einzige, den weniger die Tatsache stört, dass bestimmte unbedeutende Veränderungen als “effektiv” oder “weniger effektiv” bezeichnet werden, als vielmehr die Tatsache, dass den Formulierungen nach eigentlich das Wort “effizient” gemeint ist? Wie auch immer, ich finde, es kann (aus rein akademischen Gründen) nicht schaden, sich mal die Frage zu stellen, wie man so etwas am effizientesten löst, aber sollte sich im Klaren sein, dass in der Praxis meistens (!) andere Dinge im Vordergrund stehen.

Das ganze Thema stört mich, weil es der ursprünglichen Frage entrissen wurde, und weil auf meine Bitte hin einfach das Genteil gemacht wurde. Ich werde nachher noch mal eine freundliche PM/N an 5 Moderatoren schreiben und das Thema noch mal aufgreifen.

Aber das mal beiseite.

  1. Tut der Algo was er soll?
  2. Ist der Programmtext lesbar?
  3. Ist das Programm schnell/klein/effizient?

Jemand Einwände dagegen oder der Meinung, Meine Implementierung würde alle 3 Punkte nicht zumit 1+ (Eins Plus) erfüllen?

War die Aufgabe eine Endlosschleife zu generieren, bzw wenn mans genaunimmt ne Schleife die bis zum Vorzeichenwechsel geht. Finde ich jetzt nicht so sinnvoll aber gut. Und wenn hier gewisse Menschen schon so auf “Optimierungen” aus sind: ++i ist schneller bzw performanter als i++.

for (int i = 0; i >= 0; i++) { ist auch langsamer als for (int i = 0;; i++) { (zu überlegen wäre ob ein Bitshift schneller als ein i++; wäre), aber dabei hast du das Problem das s mit negativen Zahlen nicht funktioniert, daher das i >= 0;. Ich bin heute angestichelt, als provoziert mich nicht mehr als nötig.

(Gerade nicht angemeldet).

Falls du dir unsicher bist wer das Thema abgespalten hat: das war ich. Warum ist ganz einfach: Das ganze hier hat nichts mit der Frage des TOs vom anderen Thema zu tun. Der TO wollte eine Erklärung für seinen Fall und keine andere Lösung die ihn nur verwirrt. Das kannst du vergleichen mit: der Lehrer gibt dir eine Aufgabe mit „Finde den Fehler“ und du schreibst ihm eine andere Lösungmöglichkeit hin - darauf würdest du keine Punkte bekommen, da du die Aufgabenstellung nicht erfüllt hast. Warum du dich aufregst ist mir nicht ganz klar: jetzt hast du dein eigenes Thema und es ist nicht mehr OT. Der TO vom anderen Thema wird nicht unnötig verwirrt und es ist aufgeräumt. Win-Win-Situation also.
Wenn es doch noch irgendwas dazu gibt, dann darfst du das gerne mit mir über PM klären (Vorab: übers WE bin ich oft wenig/garnicht aktiv, also nicht Wundern wenn eine Antwort erst am Montag kommt).

Ja gut, dann ist das Thema gegessen und weil es nicht direkt etwas mit der ursprünglichen Frage zu tun gehabt hatte, kann es jetzt imn Untergrund verschwinden. Allen ein schönes Wochenende, ich mache wohl heute nix mehr.

Ich sag nur

6 Monate alte Threads ausgraben… :frowning: