Ich suche eine einfache Commons-Methode oder einen Operator, der es mir erlaubt, eine Zeichenkette zu wiederholen n Zeiten. Ich weiß, ich könnte dies mit einer for-Schleife schreiben, aber ich möchte for-Schleifen vermeiden, wann immer es nötig ist, und eine einfache direkte Methode sollte irgendwo existieren.
String str = "abc";
String repeated = str.repeat(3);
repeated.equals("abcabcabc");
Verwandt mit:
wiederholen string javascript Erstellen von NSString durch Wiederholung einer anderen Zeichenfolge eine bestimmte Anzahl von Malen
Bearbeitet
Ich versuche, for-Schleifen zu vermeiden, wenn sie nicht unbedingt notwendig sind, denn:
-
Sie erhöhen die Anzahl der Codezeilen, auch wenn sie in einer anderen Funktion versteckt sind.
-
Jemand, der meinen Code liest, muss herausfinden, was ich in dieser for-Schleife tue. Selbst wenn der Code kommentiert ist und aussagekräftige Variablennamen hat, muss er sich vergewissern, dass er nicht irgendetwas "Schlaues" macht.
-
Programmierer lieben es, clevere Dinge in for-Schleifen einzubauen. Selbst wenn ich schreibe, dass die Schleife "nur das tut, was sie tun soll", schließt das nicht aus, dass jemand vorbeikommt und eine zusätzliche clevere "Lösung" einbaut.
-
Sie sind oft sehr leicht zu verwechseln. For-Schleifen, die Indizes beinhalten, neigen dazu, Fehler zu erzeugen, die sich um einen Fehler unterscheiden.
-
In For-Schleifen werden oft dieselben Variablen wiederverwendet, was die Wahrscheinlichkeit von schwer zu findenden Scoping-Fehlern erhöht.
-
Denn Schleifen erhöhen die Anzahl der Stellen, an denen ein Wanzenjäger suchen muss.
48 Stimmen
Ich weiß, dass for-Schleifen einige echte Probleme verursachen können. Aber man sollte nicht versuchen, for-Schleifen "um jeden Preis" zu vermeiden, denn wenn das auf Kosten von Lesbarkeit, Wartbarkeit und Geschwindigkeit geht, ist das kontraproduktiv. Dies ist einer dieser Fälle.
2 Stimmen
Daher sollten Sie sich überlegen, ob Sie für Ihren Code nicht ausführliche Unittests durchführen wollen. So können Sie die Unit-Tests einfach anzeigen, wenn eine Dokumentation benötigt wird.
10 Stimmen
"Sie erhöhen die Anzahl der Codezeilen, auch wenn sie in einer anderen Funktion versteckt sind"... wow, einfach wow. Big-O, nicht LoC
8 Stimmen
@imagist Ich vermeide for-Schleifen in Situationen, in denen es mich Lesbarkeit und Wartungsfreundlichkeit kostet. Ich betrachte die Geschwindigkeit als das unwichtigste Problem (eigentlich ein Nicht-Problem). Ich denke, dass for-Schleifen zu oft verwendet werden, und ich versuche zu lernen, for-Schleifen nur dann zu verwenden, wenn sie notwendig sind, und nicht als Standardlösung.
4 Stimmen
@Pyrolistical Ich erhebe keinen Anspruch auf Leistung oder asymptotische Vorteile. Vielmehr sage ich, dass ich durch das Schreiben von weniger Code und die Verwendung von Bibliotheksfunktionen, anstatt das Rad neu zu erfinden, die Fehlerfläche (Codezeilen) reduziere und gleichzeitig die Lesbarkeit erhöhe. Beides gute Dinge, da werden Sie mir sicher zustimmen.
0 Stimmen
@e5: Das sind gute Dinge, aber sie ergeben sich nicht immer aus der Verwendung von Bibliotheksfunktionen. Was man Ihnen damit sagen will, ist, dass eine unangemessene Verwendung von Bibliotheksfunktionen (z.B. "Schleifen um jeden Preis vermeiden") die Lesbarkeit verringern, die Fehlerfläche vergrößern [*] und Ihre Anwendung katastrophal langsamer machen kann. [Auch Bibliotheken können Bugs haben!]
1 Stimmen
@Stephen C , Oh ja, ich stimme dem, was Sie gerade gesagt haben, vollkommen zu! Wenn ich sage "Vermeiden Sie Schleifen um jeden Preis", dann übertreibe ich ein wenig, um einen dramatischen Effekt zu erzielen. For-Schleifen sind notwendig und gut, aber ich sehe eine übermäßige Verwendung von ihnen in meinem Code und in anderen. Ich versuche lediglich, meinen Stil zu verbessern.
4 Stimmen
@e5;entschuldigen Sie, dass ich erst Jahre später poste. Ich finde diese Frage so passend. Wenn in einer Methode eingefügt, sollten Argumente getestet werden (mal>=0), Fehler geworfen werden usw.Das bringt Robustheit aber auch Zeilen an Code zu lesen. Wer den Code liest, weiß genau, was eine string.repeat tut, auch ohne eine Zeile Kommentar oder javadoc.Wenn wir eine stabile Bibliothek verwenden, ist vernünftig zu denken, dass eine so einfache Funktion keine Bugs hat, JEDOCH führt irgendeine Form von "Robustheit" überprüfen, dass wir sogar Sorgen zu machen.Wenn ich 10 Verbesserungen fragen könnte, würde diese (Art) Dinge eine sein.
2 Stimmen
@AgostinoX Wenn ich auf diese Frage zurückblicke, erkenne ich ein weiteres Problem mit for-Schleifen. Sie geben die Reihenfolge vor, in der Aktionen ausgeführt werden müssen, obwohl der Ingenieur meistens nur eine Aktion für jedes Element in einer Liste ausführen möchte (unabhängig von der Reihenfolge). Diese Abhängigkeit von der Reihenfolge erschwert es den Compilern, den Code zu parallelisieren. Ich denke, die Python-Map-Funktion hat das Recht dazu: docs.python.org/library/functions.html#map
0 Stimmen
@AgostinoX Hebt die Mistgabel in völliger Zustimmung. "Tod der for-Schleife, es lebe die Lesbarkeit"!
1 Stimmen
@e5:ein weiterer guter Grund, um Schleifen zu vermeiden, ist, dass Java bereits Iteratoren eingeführt hat, deren einziger Zweck es ist, die Deklaration von Schleifen zu erleichtern. String[] x = {"think?", "you", "dont"}; for (int i=x.length-1;i>=0;i--) { System.out.println(x[i]); }
1 Stimmen
@e5: Die Frage nach der Reihenfolge ist richtig, aber ich denke, dass man eine prozedurale Sprache nicht "einfach so" in eine deklarative Sprache umwandeln kann. Ich weiß nicht, ob Sie sich so entspannt fühlen, wenn Sie Sammlungselemente iterieren und einige von ihnen löschen, weil "Sie nur eine Aktion für jedes Element durchführen wollen" und es der Bibliotheksimplementierung überlassen, "kein Durcheinander anzurichten". Vielleicht sollten Sie sich eingehender mit der API befassen. Wenn Sie keine Zeit hätten, würden Sie wahrscheinlich einen ausfallsicheren prozeduralen Ansatz wie ein Downto-Removal wählen :-)
1 Stimmen
@e5: ich denke jedoch, dass mehrere dieser Gründe ziemlich "streng" sind. vielleicht genug, um einen JCP-Antrag zu stellen. wäre das nicht wunderbar?
1 Stimmen
"Cleverer" Code sollte vermieden werden.
for
Schleifen sollten nicht. Lassen Sie den Code das tun, wonach er aussieht, und verwenden Sie bei Bedarf viele Zeilen. Ihr Compiler wird alles klein und clever machen - aus den Augen.3 Stimmen
@Floris "Cleverer" Code devrait vermieden werden, da stimme ich zu. Aber for-Schleifen sind "cleverer" Code, an den man sich gerade gewöhnt hat. Bedenken Sie, dass die for-Schleife auf einer mathematischen Beziehung zwischen der Art und Weise, wie wir Zeichenketten in Arrays speichern (eine ziemlich willkürliche, maschinenabhängige Wahl) und einer periodisch ansteigenden Ganzzahl beruht. Bevor Sie widersprechen, versuchen Sie, einem Nicht-Programmierer zu erklären, wie Sie "eine Zeichenkette mit for-Schleifen wiederholen".
2 Stimmen
@EthanHeilman es geht los: "Wir speichern die Zeichenkette als eine Liste von Zeichen, jedes in einem nummerierten Feld. Wenn ich eine Zeichenkette brauche, die 100 Zeichen lang ist, füge ich zuerst ein Zeichen in Feld 1 ein, dann in Feld 2 und so weiter, bis ich bei Feld 100 angekommen bin. Dann höre ich auf, Zeichen hinzuzufügen. "Das scheint die for-Schleife recht gut zu beschreiben. Ich habe beschlossen, den "Null-Offset" nicht zu erklären, da er für die Erklärung für den Nicht-Programmierer irrelevant ist.
1 Stimmen
Wenn Sie mit Java 11 arbeiten, können Sie
String::repeat
- siehe diese Antwort .1 Stimmen
Repeats = "abc" * 3 Python ist viel komprimierter als Java