Gibt es in Java eine Möglichkeit, eine Zeichenfolge mit einer bestimmten Nummer eines bestimmten Zeichens zu erstellen? In meinem Fall müsste ich eine Zeichenfolge mit 10 Leerzeichen erstellen. Mein aktueller Code lautet:
StringBuffer outputBuffer = new StringBuffer(length);
for (int i = 0; i < length; i++){
outputBuffer.append(" ");
}
return outputBuffer.toString();
Gibt es einen besseren Weg, um das Gleiche zu erreichen? Insbesondere möchte ich etwas, das schnell ist (in Bezug auf die Ausführung).
java
string
stringbuffer
Kreuz
quelle
quelle
append(' ')
stattdessen ... es erfordert etwas weniger Rechenaufwand ...Antworten:
Die for-Schleife wird vom Compiler optimiert. In solchen Fällen wie Ihrem müssen Sie sich nicht selbst um die Optimierung kümmern. Vertrauen Sie dem Compiler.
Übrigens, wenn es eine Möglichkeit gibt, eine Zeichenfolge mit n Leerzeichen zu erstellen, wird sie genauso codiert, wie Sie es gerade getan haben.
quelle
static Dictionary<int, String>
?" ".substring(0, 10);
Wahrscheinlich der kürzeste Code, der
String
ausschließlich die API verwendet:Als Methode, ohne direkt zu instanziieren
char
:Rufen Sie auf mit:
quelle
Hmm jetzt, wo ich darüber nachdenke, vielleicht
Arrays.fill
:Natürlich gehe ich davon aus, dass die
fill
Methode dasselbe tut wie Ihr Code, daher wird sie wahrscheinlich ungefähr die gleiche Leistung erbringen, aber zumindest sind dies weniger Zeilen.quelle
Arrays.fill()
Funktion , wenn sie konsistent für diese Aufgabe in Ihrem Code und (Standard- und externem) Bibliothekscode verwendet wird, ein guter Kandidat für die Hotspot-Kompilierung ist und eine bessere Chance hat, Ihren CPU-Cache zu finden. Zukünftige JVMs können es als intrinsische Funktion zuweisen . Das Rollen Ihrer eigenen schneidet Sie von all dieser Leistungsgüte ab ...Ich empfehle dringend, die Schleife nicht von Hand zu schreiben. Das werden Sie im Laufe Ihrer Programmierkarriere immer wieder tun. Leute, die Ihren Code lesen - das schließt Sie ein - müssen immer Zeit investieren, auch wenn es nur einige Sekunden sind, um die Bedeutung der Schleife zu verstehen.
Verwenden Sie stattdessen eine der verfügbaren Bibliotheken wieder, die Code bereitstellen, der genau das tut, wie
StringUtils.repeat
in Apache Commons Lang :Auf diese Weise müssen Sie sich auch nicht um die Leistung kümmern, sodass alle wichtigen Details
StringBuilder
, Compiler-Optimierungen usw. verborgen bleiben. Wenn sich die Funktion als langsam herausstellen würde, wäre dies ein Fehler in der Bibliothek.Mit Java 11 wird es noch einfacher:
quelle
In Java 8 können Sie Folgendes verwenden
String.join
:quelle
Wenn Sie nur Leerzeichen möchten, wie wäre es dann mit:
was zu abs (n) Leerzeichen führt;
quelle
seit Java 11 :
seit Java 8 :
wo:
quelle
Seit Java 11 können Sie einfach verwenden
String.repeat(count)
, um Ihr Problem zu lösen.Anstelle einer Schleife würde Ihr Code also einfach so aussehen:
quelle
Ich denke, dies ist der weniger mögliche Code, der die Guava Joiner-Klasse verwendet:
quelle
pubic String n(int n) { ... }
die noch "weniger" Code zulässt.n(10)
Aber auch dies macht keinen Sinn.Sie können die Standardfunktion
String.format
zum Generieren von N Leerzeichen verwenden. Beispielsweise:Erstellt eine Zeichenfolge mit 5 Leerzeichen.
oder
Erstellt eine Zeichenfolge mit 15 Leertasten.
Wenn Sie möchten, dass sich ein anderes Symbol wiederholt, müssen Sie Leerzeichen durch das gewünschte Symbol ersetzen:
Ausgabe:
quelle
Mein Beitrag basiert auf dem Algorithmus zur schnellen Potenzierung.
Ich habe den Algorithmus gegen zwei andere Ansätze getestet:
String.concat()
zum Verketten von ZeichenfolgenStringBuilder
Testcode (Verkettung mit einer for-Schleife
String.concat()
, die für große zu langsam wirdn
, daher habe ich sie nach der 5. Iteration weggelassen).Ergebnisse:
Fazit:
n
- verwenden Sie den rekursiven Ansatzn
- für Schleife hat ausreichende Geschwindigkeitquelle
if
Anweisungen werden die Verzweigungsvorhersage der CPU durcheinander bringen. Dies sollte wirklich mit JMH ( openjdk.java.net/projects/code-tools/jmh ) wiederholt werden , sonst ist es ein bisschen sinnlos.Wie wäre es damit?
quelle
In Anbetracht dessen haben wir:
Java 8 (Verwenden von Stream)
Java 8 (Verwenden von nCopies)
quelle
Collectors.joining(EMPTY_STRING)
ist gleichbedeutend mitCollectors.joining()
RandomStringUtils bietet die Möglichkeit , eine Zeichenfolge aus der angegebenen Eingabegröße zu erstellen. Ich kann die Geschwindigkeit nicht kommentieren, aber es ist ein Einzeiler.
erstellt eine Ausgabe
vorzuziehen, wenn Sie \ 0 nicht in Ihrem Code sehen möchten .
quelle
Verwenden Sie StringUtils: StringUtils.repeat ('', 10)
quelle
In den meisten Fällen benötigen Sie nur Strings bis zu einer bestimmten Länge, z. B. 100 Leerzeichen. Sie können ein Array von Zeichenfolgen vorbereiten, bei dem die Indexnummer der Größe der mit Leerzeichen gefüllten Zeichenfolge entspricht, und die Zeichenfolge nachschlagen, wenn die erforderliche Länge innerhalb der Grenzen liegt, oder sie bei Bedarf erstellen, wenn sie außerhalb der Grenze liegt.
quelle
Die kürzeste Lösung mit Guave:
Über eine einfache Möglichkeit, einen String in Java zu wiederholen .
quelle
Ersetzen Sie einfach Ihren StringBuffer durch einen StringBuilder . Schwer zu schlagen.
Wenn Ihre Länge eine große Zahl ist, können Sie eine effizientere (aber ungeschicktere) Selbstanhängung implementieren und die Länge in jeder Iteration duplizieren:
Sie können auch den
Arrays.fill()
Ansatz ausprobieren ( Antwort von FrustratedWithFormsDesigner ).quelle
Sie können ersetzen
StringBuffer
mitStringBuilder
(letzteres nicht synchronisiert ist, kann ein schneller in einem einzigen Thread app)Und Sie können die
StringBuilder
Instanz einmal erstellen , anstatt sie jedes Mal zu erstellen, wenn Sie sie benötigen.Etwas wie das:
Und benutze es so:
Wenn Sie Ihre
createA
als Instanzvariable halten, können Sie Zeit beim Erstellen von Instanzen sparen.Dies ist nicht threadsicher. Wenn Sie mehrere Threads haben, sollte jeder Thread eine eigene Kopie haben.
quelle
Kombinieren Sie für eine gute Leistung die Antworten von Aznilamir und von FrustratedWithFormsDesigner
Passen Sie die Größe
BLANKS
an Ihre Anforderungen an. Meine spezifischeBLANKS
Zeichenfolge ist ungefähr 200 Zeichen lang.quelle
Haben Sie eine Methode wie diese. Hiermit werden die erforderlichen Leerzeichen am Ende des Gegebenen angehängt
String
, um ein GegebenesString
zur Länge einer bestimmten Länge zu machen.quelle
Wenn der String eine feste Größe haben soll, müssen Sie ihn entweder auffüllen oder abschneiden, um Daten zu tabellieren ...
Hervorragende Referenz hier .
quelle
Dies hat für mich ohne Verwendung externer Bibliotheken in Java 8 funktioniert
Und die Ausgabe ist
quelle
int c = 10; String Leerzeichen = String.format ("%" + c + "c", ''); Dies wird Ihr Problem lösen.
quelle
Eine einfache Methode wie unten kann ebenfalls verwendet werden
quelle
Wie wäre es damit?
EDIT: Ich habe einen einfachen Code geschrieben, um das Konzept zu testen und hier, was ich gefunden habe.
Methode 1: Hinzufügen eines einzelnen Leerzeichens in einer Schleife:
Methode 2: 100 Leerzeichen und Schleife anhängen, dann Teilzeichenfolge:
Das Ergebnis ist, dass ich 12.345.678 Leerzeichen erschaffe:
und für 10.000.000 Plätze:
Das Kombinieren von direkter Zuordnung und Iteration nimmt immer weniger Zeit in Anspruch, durchschnittlich 60 ms weniger, wenn große Räume erstellt werden. Bei kleineren Größen sind beide Ergebnisse vernachlässigbar.
Aber bitte weiter kommentieren :-)
quelle
Ich kenne keine eingebaute Methode für das, wonach Sie fragen. Für eine kleine feste Länge wie 10 sollte Ihre Methode jedoch ausreichend schnell sein.
quelle