Ich suche nach einer einfachen Commons-Methode oder einem einfachen Commons-Operator, mit dem ich einige Zeichenfolgen n- mal wiederholen kann . Ich weiß, dass ich dies mit einer for-Schleife schreiben könnte, aber ich möchte for-Schleifen bei Bedarf vermeiden, und irgendwo sollte eine einfache direkte Methode existieren.
String str = "abc";
String repeated = str.repeat(3);
repeated.equals("abcabcabc");
Bezüglich:
String-Javascript wiederholen Erstellen Sie NSString, indem Sie einen anderen String eine bestimmte Anzahl von Malen wiederholen
Bearbeitet
Ich versuche, for-Schleifen zu vermeiden, wenn sie nicht unbedingt erforderlich sind, weil:
Sie erhöhen die Anzahl der Codezeilen, selbst wenn sie in einer anderen Funktion versteckt sind.
Jemand, der meinen Code liest, muss herausfinden, was ich in dieser for-Schleife mache. Selbst wenn es kommentiert ist und aussagekräftige Variablennamen hat, müssen sie dennoch sicherstellen, dass es nichts "Kluges" tut.
Programmierer lieben es, clevere Dinge für Schleifen einzufügen, auch wenn ich sie schreibe, um "nur das zu tun, was sie tun sollen", was nicht ausschließt, dass jemand mitkommt und zusätzliche clevere "Korrekturen" hinzufügt.
Sie sind sehr oft leicht zu verwechseln. Bei Schleifen, an denen Indizes beteiligt sind, wird dies in der Regel durch einen Fehler ausgelöst.
For-Schleifen verwenden häufig dieselben Variablen wieder, was die Wahrscheinlichkeit erhöht, dass Scoping-Fehler wirklich schwer zu finden sind.
Für Schleifen erhöhen Sie die Anzahl der Stellen, nach denen ein Insektenjäger suchen muss.
Antworten:
String::repeat
Neu in Java 11 ist die Methode
String::repeat
, die genau das tut, wonach Sie gefragt haben:Sein Javadoc sagt:
quelle
"abc".repeat(3)
Hier ist die kürzeste Version (Java 1.5+ erforderlich):
Wo
n
ist die Häufigkeit, mit der Sies
die Zeichenfolge wiederholen möchten, und wo wird die Zeichenfolge wiederholt?Keine Importe oder Bibliotheken erforderlich.
quelle
char[]
in diesem Fall) werden mit Nullen instanziiert, dannString
wird a aus dem erstelltchar[]
, und die Nullen haben das gewünschtereplaced()
Zeichens
...replace('\0', str)
sollte anstelle der String-Version verwendet werden.replace(char oldChar, char newChar)
undreplace(CharSequence target, CharSequence replacement)
so sehe ich nicht, wie das funktionieren könnteWenn Sie Java <= 7 verwenden , ist dies so "prägnant" wie es nur geht:
In Java 8 und höher gibt es eine besser lesbare Möglichkeit:
Schließlich gibt es für Java 11 und höher eine neue
repeat(int count)
Methode speziell dafür ( Link )Wenn Ihr Projekt Java-Bibliotheken verwendet, gibt es alternativ mehr Optionen.
Für Apache Commons :
Für Google Guava :
quelle
n
Null ist.s
muss String sein, kein aChar
Commons Lang StringUtils.repeat ()
Verwendungszweck:
quelle
Java 8
String.join
bietet eine ordentliche Möglichkeit, dies in Verbindung mitCollections.nCopies
:quelle
Hier ist eine Möglichkeit, dies nur mit Standard-String-Funktionen und ohne explizite Schleifen zu tun:
quelle
replace()
. In Java 1.5+ gibt es eine überladene Versionreplace()
, die zwei Sekunden benötigtCharSequence
(einschließlichString
s): download.oracle.com/javase/1.5.0/docs/api/java/lang/…n=3
: es erste Formate einen String zu sehen etwas wie%03d
(%%
ist das Prozentzeichen zu entkommen), die die Formatierung von Code 3 padding Nullen hinzufügen, dann Formate0
mit dem, was zu000
und ersetzt schließlich jeweils0
mit den SaitenWenn Sie wie ich sind und Google Guava und nicht Apache Commons verwenden möchten. Sie können die Wiederholungsmethode in der Guava Strings-Klasse verwenden.
quelle
Mit Java-8können Sie auch verwenden
Stream.generate
.und Sie können es bei Bedarf in eine einfache Dienstprogrammmethode einbinden:
quelle
return IntStream.range(0, times).mapToObj(i -> str).collect(joining());
was besser parallelisiertSie möchten also Schleifen vermeiden?
Hier hast du es:
(Natürlich weiß ich, dass dies hässlich und ineffizient ist, aber es hat keine Schleifen :-p)
Sie wollen es einfacher und schöner? benutze jython:
Edit : lass es uns ein bisschen optimieren :-D
Edit2 : Ich habe einen schnellen und schmutzigen Benchmark für die 4 Hauptalternativen durchgeführt, aber ich habe keine Zeit, ihn mehrmals auszuführen, um die Mittelwerte zu ermitteln und die Zeiten für mehrere Eingaben zu zeichnen ... Also hier ist der Code, wenn jemand möchte es versuchen:
Es werden 2 Argumente benötigt, das erste ist die Anzahl der Iterationen (jede Funktion wird mit den Wiederholungszeiten arg von 1..n ausgeführt) und das zweite ist die zu wiederholende Zeichenfolge.
Bisher lässt eine schnelle Überprüfung der Zeiten mit unterschiedlichen Eingaben das Ranking in etwa so (besser zu schlechter):
Ich hätte nie gedacht, dass die rekursive Funktion schneller ist als die
for
Schleife: -oViel Spaß (ctional xD).
quelle
Dies enthält weniger Zeichen als Ihre Frage
quelle
commons-lang3.3.1-sources
und du bist nicht mehr so gut;) Aber wenn jemand schon hatcommons-lang
, unterstütze ich deine Antwort.Basierend auf der Antwort von fortran ist dies eine wiederkehrende Version, die einen StringBuilder verwendet:
quelle
Die Verwendung von Dollar ist so einfach wie die Eingabe:
PS: Wiederholen funktioniert auch für Array, Liste, Set usw.
quelle
Ich wollte eine Funktion zum Erstellen einer durch Kommas getrennten Liste von Fragezeichen für JDBC-Zwecke und fand diesen Beitrag. Also entschied ich mich für zwei Varianten und sah, welche besser abschnitt. Nach 1 Million Iterationen dauerte die Gartenart StringBuilder 2 Sekunden (fun1) und die kryptisch vermeintlich optimalere Version (fun2) 30 Sekunden. Was bringt es, wieder kryptisch zu sein?
quelle
OOP-Lösung
Fast jede Antwort schlägt eine statische Funktion als Lösung vor, aber wenn ich objektorientiert denke (aus Gründen der Wiederverwendbarkeit und Klarheit), habe ich eine Lösung über die Delegierung über die CharSequence-Schnittstelle gefunden (die auch die Verwendbarkeit für veränderbare CharSequence-Klassen eröffnet).
Die folgende Klasse kann entweder mit oder ohne Separator-String / CharSequence verwendet werden, und jeder Aufruf von "toString ()" erstellt den letzten wiederholten String. Der Input / Separator ist nicht nur auf die String-Klasse beschränkt, sondern kann jede Klasse sein, die CharSequence implementiert (z. B. StringBuilder, StringBuffer usw.)!
Quellcode:
Anwendungsbeispiel:
Beispielausgabe:
quelle
Wenn Sie nur JRE-Klassen ( System.arraycopy ) verwenden und versuchen, die Anzahl der temporären Objekte zu minimieren, können Sie Folgendes schreiben:
BEARBEITEN
und ohne Schleifen können Sie versuchen mit:
BEARBEITEN 2
Die Verwendung von Sammlungen ist noch kürzer:
Ich mag jedoch immer noch die erste Version.
quelle
Nicht der kürzeste, aber (glaube ich) der schnellste Weg ist die Verwendung des StringBuilder:
quelle
Wenn Geschwindigkeit Ihr Anliegen ist, sollten Sie so wenig Speicher wie möglich kopieren. Daher ist es erforderlich, mit Arrays von Zeichen zu arbeiten.
Um die Geschwindigkeit zu testen, sieht eine ähnliche optimale Methode mit StirngBuilder folgendermaßen aus:
und den Code zum Testen:
Und hier resultiert der Lauf aus meinem System:
Beachten Sie, dass der Test für die Schleife darin besteht, JIT einzuschalten und optimale Ergebnisse zu erzielen.
quelle
aus Gründen der Lesbarkeit und Portabilität:
quelle
Wenn Sie sich Sorgen um die Leistung machen, verwenden Sie einfach einen StringBuilder in der Schleife und führen Sie beim Beenden der Schleife einen .toString () aus. Schreiben Sie Ihre eigene Util-Klasse und verwenden Sie sie erneut. 5 Codezeilen max.
quelle
Ich genieße diese Frage wirklich. Es gibt viel Wissen und Stile. Also kann ich es nicht verlassen, ohne meinen Rock and Roll zu zeigen;)
Gefällt es dir
quelle
quelle
Einfache Schleife
quelle
times
an den StringBuilder-Konstruktor.Probieren Sie es aus:
quelle
Mit der Rekursion können Sie Folgendes tun (mit ternären Operatoren, maximal eine Zeile):
Ich weiß, es ist hässlich und wahrscheinlich nicht effizient, aber es ist eine Zeile!
quelle
Eine einfache einzeilige Lösung:
erfordert Java 8
quelle
Trotz Ihres Wunsches, keine Schleifen zu verwenden, sollten Sie eine Schleife verwenden.
Ihre Gründe, eine for-Schleife nicht zu verwenden, sind nicht gut. Als Antwort auf Ihre Kritik:
quelle
repetitions = -5
. b) Commons Lang herunterladen undrepeatString('a', 1000)
millionenfach in einer Schleife ausführen ; Machen Sie dasselbe mit Ihrem Code. Vergleiche die Zeiten. Für zusätzliche Gutschrift machen Sie dasselbe mitrepeatString('ab', 1000)
.StringUtils.repeat("ab",1000)
? Denn das war meine Antwort, die Sie abgelehnt haben. Es funktioniert auch besser und hat keine Fehler.Wenn Sie nur die Länge der Ausgabezeichenfolge kennen (und diese möglicherweise nicht durch die Länge der Eingabezeichenfolge teilbar ist), verwenden Sie diese Methode:
Nutzungsdemo:
Nicht mit leer verwenden
s
undlength
> 0 verwenden, da in diesem Fall nicht das gewünschte Ergebnis erzielt werden kann.quelle
Hier ist die neueste Version von Stringutils.java StringUtils.java
Es muss nicht einmal so groß sein, kann daraus gemacht werden und kann kopiert und in eine Utility-Klasse in Ihrem Projekt eingefügt werden.
Also e5, ich denke, der beste Weg, dies zu tun, wäre einfach den oben genannten Code oder eine der Antworten hier zu verwenden. Aber Commons Lang ist einfach zu groß, wenn es sich um ein kleines Projekt handelt
quelle
Ich habe eine rekursive Methode erstellt, die genau das tut, was Sie wollen. Sie können diese verwenden ...
Ich habe die gleiche Antwort auf Kann ich Strings in Java multiplizieren, um Sequenzen zu wiederholen?
quelle
StringBuilder
stattdessen.Sie können diese rekursive Methode für Ihr gewünschtes Ziel verwenden.
quelle