Einfache Weise zu wiederholen, einen String in java
Ich bin auf der Suche nach einem einfachen commons-Methode oder operator, die mir erlaubt, zu wiederholen, einige String - n Zeiten. Ich weiß, ich könnte schreiben, das mithilfe einer for-Schleife, aber ich wünschte, um zu vermeiden, Schleifen, Wann immer notwendig und eine einfache, direkte Methode sollte irgendwo vorhanden sein.
String str = "abc";
String repeated = str.repeat(3);
repeated.equals("abcabcabc");
Bezug auf:
wiederholen Sie die Zeichenfolge javascript
Erstellen NSString durch die Wiederholung eine andere Zeichenfolge, die eine bestimmte Anzahl von Zeiten
Bearbeitet
Ich versuche zu vermeiden, for-Schleifen, wenn Sie nicht absolut notwendig, weil:
- Fügen Sie die Anzahl der code-Zeilen, auch wenn Sie versteckt in einer anderen Funktion.
- Jemand liest mein code hat, um herauszufinden, was ich Tue, in dieser for-Schleife. Auch wenn es auskommentiert ist und hat sinnvolle Variablen-Namen, die Sie noch haben, um sicherzustellen, es ist nichts zu tun "clever".
- Programmierer gesetzt Liebe schlaue Dinge in for-Schleifen, auch wenn ich Schreibe es "nur tun, was es tun sollte", schließt nicht aus, dass jemand kommen und das hinzufügen einige zusätzliche clever "fix".
- Sind Sie sehr oft leicht etwas falsch laufen. For-Schleifen mit Indizes neigen zu generieren, ausgeschaltet, indem man bugs.
- For-Schleifen oft die Wiederverwendung der gleichen Variablen, erhöht die chance, wirklich schwer zu finden, scoping-bugs.
- For-Schleifen erhöhen die Anzahl der Plätze ein bug hunter hat zu schauen.
Ich verstehe, dass for-Schleifen können dazu führen, dass einige echte Probleme. Aber Sie sollten nicht versuchen, zu vermeiden Schleifen "um jeden Preis", denn wenn es kostet Sie Lesbarkeit, Wartbarkeit und Geschwindigkeit, Sie sind kontraproduktiv. Dies ist einer dieser Fälle.
"Sie fügen hinzu, um die Anzahl der code-Zeilen, auch wenn Sie versteckt in einer anderen Funktion"...wow, einfach nur wow. Big-O, nicht LoC
Ich bin die Vermeidung von for-Schleifen in Situationen, wo es mich kostet Lesbarkeit und Wartbarkeit. Ich betrachte Geschwindigkeit als die am wenigsten wichtige Frage hier (ein nicht-Thema in der Tat). Ich denke, dass for-Schleifen sind überstrapaziert und ich versuche zu lernen, nur mit for-Schleifen, wenn Sie erforderlich sind und nicht als Standard-Lösung.
Ich bin nicht fordern, Leistung oder asymptotische Vorteile. Eher sagen, dass durch das schreiben weniger code und die Verwendung von Bibliothek-Funktionen anstatt das Rad neu erfinden reduziere ich den bug Fläche(Lines of Code) bei gleichzeitiger Erhöhung der Lesbarkeit. Sowohl gute Dinge, die ich bin sicher, Sie werden Zustimmen.
für die Buchung Jahre später.Ich finde diese Frage so passend. Wenn eingefügt in eine Methode, Argumente geprüft werden sollte (mal>=0), Fehler geworfen etc.Dies fügt Robustheit, sondern auch code-Zeilen zu Lesen. Wiederholung ein string ist etwas, eindeutig.Wer den code liest, weiß genau, was ein string.wiederholen Sie tut, auch ohne eine Zeile Kommentar oder javadoc.Wenn wir eine stabile Bibliothek, sinnvoll zu denken, dass eine so einfache Funktion hat keine bugs,NOCH stellt Sie irgendeine form von "Robustheit" zu überprüfen, die wir selbst sorgen müssen.Wenn ich bei 10 Verbesserungen, diese (Art von) Dinge wäre.
"Sie fügen hinzu, um die Anzahl der code-Zeilen, auch wenn Sie versteckt in einer anderen Funktion"...wow, einfach nur wow. Big-O, nicht LoC
Ich bin die Vermeidung von for-Schleifen in Situationen, wo es mich kostet Lesbarkeit und Wartbarkeit. Ich betrachte Geschwindigkeit als die am wenigsten wichtige Frage hier (ein nicht-Thema in der Tat). Ich denke, dass for-Schleifen sind überstrapaziert und ich versuche zu lernen, nur mit for-Schleifen, wenn Sie erforderlich sind und nicht als Standard-Lösung.
Ich bin nicht fordern, Leistung oder asymptotische Vorteile. Eher sagen, dass durch das schreiben weniger code und die Verwendung von Bibliothek-Funktionen anstatt das Rad neu erfinden reduziere ich den bug Fläche(Lines of Code) bei gleichzeitiger Erhöhung der Lesbarkeit. Sowohl gute Dinge, die ich bin sicher, Sie werden Zustimmen.
für die Buchung Jahre später.Ich finde diese Frage so passend. Wenn eingefügt in eine Methode, Argumente geprüft werden sollte (mal>=0), Fehler geworfen etc.Dies fügt Robustheit, sondern auch code-Zeilen zu Lesen. Wiederholung ein string ist etwas, eindeutig.Wer den code liest, weiß genau, was ein string.wiederholen Sie tut, auch ohne eine Zeile Kommentar oder javadoc.Wenn wir eine stabile Bibliothek, sinnvoll zu denken, dass eine so einfache Funktion hat keine bugs,NOCH stellt Sie irgendeine form von "Robustheit" zu überprüfen, die wir selbst sorgen müssen.Wenn ich bei 10 Verbesserungen, diese (Art von) Dinge wäre.
InformationsquelleAutor Ethan Heilman | 2009-08-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus Java 11 auf, da gibt es die Methode
(String::repeat
, das genau das tut, was Sie gefragt haben:Seine Javadoc sagt:
Java 11 geplant ist der Start im Sep-2018
source-code für Sie, nur für den Fall jemand interessiert hg.openjdk.java.net/jdk/jdk/file/fc16b5f193c7/src/java.base/...
ich habe das noch gar nicht gesehen-java - 9 doch auf der Straße (und nicht für eine langen -..) - und 11 ist anscheinend eingestellt zu versenden..
genau lol
InformationsquelleAutor Nicolai
Hier ist die kürzeste version (Java 1.5+ erforderlich):
Wo
n
ist die Anzahl der Zeiten, die Sie wiederholen möchten, die string-und dies
ist die Zeichenfolge zu wiederholen.Keine Einfuhr-oder Bibliotheken, die benötigt werden.
char[]
, in diesem Fall) instanziiert sind mit Nullen, dann eineString
erstellt von derchar[]
, und die Nullen werdenreplaced()
mit dem Zeichen, das Sie wollen ins
Dies ist zwar sehr clever (+1) ich denke, es ist ziemlich viel beweist, die zeigen, dass for-Schleifen oft machen, um einen klareren code
Für diejenigen, die beschweren sich über Verschleierung, die Lesbarkeit hängt von der Alphabetisierung. Das ist vollkommen klar in dem, was Sie tut und lehrreich für diejenigen, die sehen es vielleicht nicht sofort. Dies ist, was Sie erhalten mit Java durch die Art und Weise.
Dies sollte wirklich als "Antwort" gekennzeichnet. Wenn Ihr auf der Suche für eine "einfache" Lösung, einschließlich der externen Bibliotheken sollte wirklich der Letzte Ausweg sein, wenn eine bessere alternative vorhanden ist. Und das ist eine sehr sehr gute alternative.
Für eine bessere Leistung
...replace('\0', str)
sollte verwendet werden, anstelle der String-version.InformationsquelleAutor user102008
Commons-Lang StringUtils.wiederholen()
Verwendung:
Sicher, außer, dass es commons lang. Ich glaube nicht, dass ich je gesehen habe, ein Projekt über 5000 LOCS, die nicht über commons lang.
Commons Lang ist eine open-source - laden Sie es und werfen Sie einen Blick. Natürlich hat es innerhalb einer Schleife, aber es ist nicht ganz so einfach. Mit viel Aufwand ging in die Profilerstellung und-Optimierung, Umsetzung.
Ich glaube nicht, vermeiden Schleifen für die performance-Gründen (Lesen Sie meine Gründe in Frage). Wenn jemand sieht, StringUtils.wiederholen Sie, Sie wissen, was ich Tue. Sie haben keine sorgen zu machen, das ich versuchte zu schreiben, meine eigene version zu wiederholen und einen Fehler gemacht. Es ist ein atomic-kognitive Einheit!
Die Verwendung und Wiederverwendung der commons-Klassen, StringUtils vor allem, reduziert den Wartungsaufwand Last in eine Reihe von Möglichkeiten. Einfache, deskriptive Methode, die mit Namen, sinnvolle Standardwerte und null-handlings und einer stabilen Codebasis, die alle machen es leichter zu identfy wo Fehler sind wahrscheinlicher zu wohnen. Eine Redewendung, die ich fördern ist, die loop-Steuerung verwendet immer "ich"; diese Kräfte nur ein loop pro-Methode, was bedeutet, dass das gemeinsame problem, inkrementiert die falsche Sache wird entfernt.
InformationsquelleAutor ChssPly76
Wenn Sie Java <= 7, das ist so einfach, wie es geht:
In Java 8 und oben gibt es eine einfache Möglichkeit:
Java 11 wurde eine neue
repeat(int count)
Methode, die speziell für diese(link)n
null ist.Die java 8 Beispiel nicht kompilieren -> " Type mismatch: cannot convert from List<Zeichen> CharSequence
werden String -, nicht um eine
Char
Danke. Meine schlecht, ich entschuldige mich. Anscheinend war ich zu müde gestern. Tut mir Leid downvoting. Ich werde entfernen Sie die downvote, sobald ich konnte (es ist blockiert, bis die Frage bearbeitet)
kein problem, machte es klar, jetzt, dass s ein string
InformationsquelleAutor Caner
Java 8
- String.join
bietet eine gute Möglichkeit, dies zu tun in Verbindung mitSammlungen.nCopies
:Vielen Dank für diese Antwort. Es scheint der sauberste Weg ohne Verwendung einer externen API-oder utility-Methode! sehr gut!!
Das schöne an dieser Methode ist, dass mit join können Sie ein Trennzeichen, das klappt sehr praktisch, wenn Sie, sagen wir, den Aufbau einer CSV-Liste. Mit allen anderen Methoden haben Sie eine Kündigung verbindenden Charakter, dass muss gestrippt werden, die in einem separaten Vorgang.
InformationsquelleAutor Boann
Hier ist ein Weg, es zu tun, nur mit standard-String-Funktionen und keine expliziten Schleifen:
Dev & fortran: Nein, er meinte
replace()
. In Java 1.5+, gibt es eine überladene version derreplace()
zweiCharSequence
s (dieString
s): download.oracle.com/javase/1.5.0/docs/api/java/lang/...Autsch. Das ist hässlich.
lassen Sie uns sagen
n=3
: die ersten, die es formatiert eine Zeichenfolge zu suchen, so etwas wie%03d
(%%
ist zu entkommen das Prozentzeichen), die die Formatierung von code und fügen 3 Polsterung Nullen, dann Formate0
mit, was zu000
, und schließlich ersetzt jedes0
mit den StreichernSie können die Lösung weniger hässlich und leichter zu verstehen: String.format("%0"+n+"d", 0).replace("0", s)
InformationsquelleAutor I. J. Kennedy
Wenn Sie wie ich sind und wollen, verwenden Sie Google Guava und nicht Apache Commons. Sie können die wiederholen Methode in die Guave Streicher-Klasse.
... und bekommen 3Mb neue Abhängigkeiten.
Ich dachte, es würde gehen, ohne zu sagen, aber zählen Sie nicht Guave, nur einen string wiederholen. Meine Antwort war, wenn Sie bereits mit Guave sowieso, dann ist dies, wie Sie es tun würde.
InformationsquelleAutor Jack
Mit java-8, Sie können auch
Stream.generate
.und Sie können wickeln Sie es in ein einfaches Dienstprogramm-Methode, wenn nötig:
return IntStream.range(0, times).mapToObj(i -> str).collect(joining());
die parallelizes besserInformationsquelleAutor Alexis C.
So dass Sie wollen, um zu vermeiden, Schleifen?
Hier haben Sie es:
(natürlich weiß ich, das ist hässlich und ineffizient, aber es muss nicht Schleifen :-p)
Sie wollen es einfacher und schöner? die Verwendung von jython:
Bearbeiten: wir optimieren es ein wenig 😀
Edit2: ich habe eine quick and dirty benchmark für die 4 wichtigsten alternativen, aber ich habe keine Zeit, um mehrere Male ausführen, um die Mittel-und plot-die Zeiten für mehrere Eingänge... Also hier der code, falls jemand es versuchen will:
Dauert es 2 Argumente, das erste ist die Anzahl der Iterationen (jede Funktion ausführen, mit wiederholten mal arg aus 1..n) und der zweite ist der string zu wiederholen.
So weit, eine schnelle Inspektion der Zeiten laufen mit unterschiedlichen Eingaben lässt die Rangliste etwas wie dies (besser, schlechter):
Hätte ich nie gedacht, dass die rekursive Funktion war schneller als die
for
Schleife 😮Haben fun(ctional xD).
fortran ist richtig; diese Lösung könnte effizienter gemacht werden. Diese Implementierung wird unnötig erstellen Sie ein neues StringBuilder (und eine neue Zeichenfolge) für jede Rekursion. Noch eine schöne Lösung wenn.
Ich würde wünschte, ich wäre ein Lisp-hacker xD... Wenn ich es wäre, würde ich verwendet haben ein tail-rekursive Funktion :-p
Microbenchmarks nicht gut in Java. Versuche zur Messung der Geschwindigkeit Ihrer Implementierungen wie das ist nicht gut.
Ich weiß, aber Sie sind immer noch besser als nichts... Und die einzige "überraschung" war die leichte Differenz zwischen der naiv-Schleife Verkettung und lineare Rekursion.
InformationsquelleAutor fortran
Diese enthält weniger Zeichen, als Sie Ihre Frage
Es sei denn, Sie sind bereits mit Apache Commons, diese Antwort ist viel weniger Aufwand - kein Download einer anderen Bibliothek, wie es in Ihrem classpath, die sicherstellen, dass Ihre Lizenz ist mit Ihrer kompatibel ist, usw.
Bitte niemals null zurück - in diesem Fall ein leerer string zurück, so dass Sie immer den Rückgabewert nicht. Ansonsten, was ich empfehlen würde, das Plakat zu verwenden.
Gut, es gibt drei Möglichkeiten, um zu behandeln, wenn s null ist. 1. Passieren die Fehler (Rückgabewert null), 2. Ausblenden der Fehler (return ""), 3. Wirft eine NPE. Verstecken Sie den Fehler und wirft eine NPE sind nicht cool, also gab ich den Fehler.
man könnte auch: 4. zurück
"nullnullnullnull"
für(null, 4)
...InformationsquelleAutor Pyrolistical
basierend auf fortran Antwort, dies ist ein recusive version nutzt einen StringBuilder:
looping statt Rekursion reduziert die Anzahl der stack-frames für eine große Anzahl von Wiederholungen.
InformationsquelleAutor dfa
mit Dollar ist einfach, wie Sie:
PS: wiederholen funktioniert auch für array, List, Set, etc
InformationsquelleAutor dfa
Ich wollte eine Funktion erstellen, die eine Komma-separierte Liste von Fragezeichen für JDBC Zwecke, und fand diesen Beitrag. So entschied ich mich für zwei Varianten und sehen, welche besser abgeschnitten. Nach 1 million Iterationen, der Garten-Vielfalt StringBuilder dauerte 2 Sekunden (fun1), und die kryptischen vermeintlich optimale version (fun2) dauerte 30 Sekunden. Was ist der Punkt, dass cryptic wieder?
InformationsquelleAutor Bob
OOP-Lösung
Fast jede Antwort schlägt vor, eine statische Funktion als Lösung, sondern denken, Objekt-Orientierte (für die Wiederverwendbarkeit-Zwecke und Klarheit) kam ich auf eine Lösung via Delegation durch das CharSequence-Interface (das öffnet auch die Benutzerfreundlichkeit auf veränderliche CharSequence-Klassen).
Die folgende Klasse verwendet werden können, entweder mit oder ohne Separator-String/CharSequence, und jeder Aufruf von "toString()" baut die endgültige wiederholte Zeichenfolge.
Die Eingabe - /Trennzeichen sind nicht nur beschränkt auf die String-Klasse, sondern kann jede Klasse, die implementiert CharSequence (z.B. StringBuilder, StringBuffer, etc.)!
Source-Code:
- Nutzung-Beispiel:
Beispiel-Ausgabe:
Der hatte gut lachen, danke
selten habe ich Dinge gesehen, die so ekelhaft :/
Es ist golden! Gutes OOP Beispiel, wenn. Es ist immer von Vorteil für die Praxis.
InformationsquelleAutor Maciej Schuttkowski
nur mithilfe der JRE-Klassen (System.arraycopy) und versuchen zu minimieren die Anzahl der temp-Objekte können Sie so etwas schreiben:
BEARBEITEN
ohne loops, die Sie versuchen können, mit:
EDIT 2
mit Sammlungen ist noch kürzer:
aber ich mag immer noch die erste version.
-1: zu klug, um die Hälfte. Wenn Ihr Ziel ist, machen Sie den code lesbar oder effizient, diese "Lösungen" sind keine gute Idee. 'wiederholen' können einfach umgeschrieben werden, mit einem StringBuilder (Einstellung der anfänglichen Kapazität). Und 'repeat2' / 'repeat3' sind wirklich ineffizient, und richten sich auf die nicht angegebene syntax für den String-produziert von String[].toString().
absolut, mit diesem code können Sie nicht verwenden "Metazeichen", [],
die Frage wurde editiert, zum anfordern ausdrücklich keine Schleifen. Ein StringBuilder-basiert Antwort wurde bereits zur Verfügung gestellt, so vermied ich post ein Duplikat
Ich kann nicht herausfinden, die downvote. Meine bearbeitete Antwort ist loop-free als requeted. Es gibt keine Anforderungen hinsichtlich der Effizienz. Ich denke, dass diese Frage ist nur ein geistige Arbeit zu produzieren, die eine Verkettung ohne loop.
InformationsquelleAutor dfa
Wenn die Geschwindigkeit ist Ihr Anliegen, dann sollten Sie verwenden weniger Speicher kopiert wie möglich. Es ist daher erforderlich, um die Arbeit mit arrays von chars.
Testen Geschwindigkeit, eine ähnlich optimale Methode mit StirngBuilder ist wie folgt:
und den code um es zu testen:
Und hier die Ergebnisse von meinem system:
Beachten Sie, dass der test für die Schleife ist kick-in JIT und haben optimale Ergebnisse zu erzielen.
InformationsquelleAutor Panayotis
Gründen der Lesbarkeit und Portabilität:
InformationsquelleAutor Martin Zeitler
Nicht die kürzeste, aber (glaube ich) der Schnellste Weg ist die Verwendung der Klasse StringBuilder:
InformationsquelleAutor Simon
Wenn Sie besorgt über die Leistung, nur mit einem StringBuilder-Objekt innerhalb der Schleife und nicht eine .toString() auf das beenden der Schleife. Was solls, schreiben Sie Ihre eigene Util-Klasse und wiederverwenden. 5 Zeilen code max.
InformationsquelleAutor WolfmanDragon
Genieße ich wirklich diese Frage. Es gibt eine Menge von wissen und Stilen. So kann ich nicht verlassen, ohne meine rock-and-roll 😉
Wie findet Ihr es?
InformationsquelleAutor Daniel De León
Einfache Schleife
times
zu StringBuilder-Konstruktor.InformationsquelleAutor Codler
Probieren Sie es aus:
InformationsquelleAutor
Mithilfe von Rekursion, die Sie tun können, die folgenden (mit ternären Betreiber, eine Zeile max):
Ich weiß, es ist hässlich und wahrscheinlich nicht effizient, aber es ist eine Zeile!
Oh, scheint niczm25 antwortete es unten
Hauptgrund, so dass dieser Weg ist O(log N) Durchschnittliche anstatt O(N) immer. Etwas mehr Optimierung, als der andere, aber immer noch schlecht dennoch.
InformationsquelleAutor HyperNeutrino
Trotz Ihres Wunsches nicht verwenden Schleifen, die ich denke, Sie sollten eine Schleife verwenden.
Ihre Gründe für die nicht-Verwendung einer for-Schleife nicht gut sind. In Reaktion auf Ihre Kritik:
repetitions = -5
. b) download-Commons-Lang und führenrepeatString('a', 1000)
eine million mal in einer Schleife; tun das gleiche mit Ihrem code; vergleichen Sie das mal. Für zusätzliche Kredit-tun Sie das gleiche mitrepeatString('ab', 1000)
.Sind Sie das argumentieren, dass Sie Ihren code besser lesbar dann
StringUtils.repeat("ab",1000)
? Weil das war meine Antwort, dass Sie schon downvoted. Es führt auch besser und hat keine Fehler.Lesen Sie den 2. Satz in der Frage, die Sie zitieren. "Ich versuche es zu vermeiden, für Schlaufen, die an allen Kosten, die da" wurde Hinzugefügt, um die Frage, wie eine Klarstellung in Reaktion auf Andrew Hare ' s Antwort erst nach meiner Antwort - nicht, dass es wichtig ist, weil, wenn die position, die Sie nehmen sind, ist "zu beantworten ist schlecht, wenn-Schleife verwendet wird überall" es gibt keine Antworten auf die OP-Frage. Auch dfa-Lösungen - erfinderisch, wie Sie sind - verwenden Sie für das Schleifen von innen. "jar-Hölle" war, antwortete auf den oben; - commons-lang ist in jedem decent-sized Anwendung sowieso und damit nicht eine neue Abhängigkeit.
an diesem Punkt bin ich ziemlich sicher, dass imagist ist trolling. Ich habe wirklich eine harte Zeit zu sehen, wie jeder Lesen konnte, was ich geschrieben habe und ernsthaft glaube, die Antworten oben eingegebenen.
meine Antworten haben keine Schlaufen, die an alle :-p
InformationsquelleAutor Imagist
InformationsquelleAutor falcon
hier ist die neueste Stringutils.java StringUtils.java
es muss nicht einmal so groß wird, gemacht werden können in diesem, und können kopiert und eingefügt werden
in einer utility-Klasse in Ihrem Projekt.
Also e5, ich denke, der beste Weg, dies zu tun wäre, nutzen Sie einfach den oben genannten code,oder eine der Antworten hier. aber commons lang ist einfach zu groß, wenn es ein kleines Projekt
InformationsquelleAutor alexmherrmann
Erstellte ich eine rekursive Methode, tun die gleiche Sache, die Sie wollen.. fühlen Sie sich frei, dies zu nutzen...
habe ich die gleiche Antwort auf Kann ich multiplizieren strings in java zu wiederholen-Sequenzen?
Dies wird langsam. Nicht empfehlenswert!!! Verwenden
StringBuilder
statt.InformationsquelleAutor niczm25
Manchmal einfach ist am besten. Alle Lesen den code sehen können, was passiert.
Und der compiler die fancy stuff mit
StringBuilder
hinter den kulissen für Sie.Das funktioniert nur, wenn n ist ein Autor-Zeit-Konstante.
InformationsquelleAutor Will