Ich weiß, dass wir Zeichenfolgen mit anhängen können StringBuilder
. Gibt es eine Möglichkeit, Zeichenfolgen voranzustellen (dh Zeichenfolgen vor einer Zeichenfolge hinzuzufügen), StringBuilder
um die Leistungsvorteile beizubehalten, die sich StringBuilder
bieten?
c#
java
stringbuilder
verbrannt1ce
quelle
quelle
Antworten:
Die Verwendung der Einfügemethode mit dem auf 0 eingestellten Positionsparameter entspricht dem Voranstellen (dh dem Einfügen am Anfang).
Ein Beispiel ist:
varStringBuilder.insert(0, "someThing");
Es funktioniert sowohl für C # als auch für Java
quelle
Das Voranstellen eines Strings erfordert normalerweise das Kopieren aller Elemente nach dem Einfügepunkt zurück in das Backing-Array, sodass es nicht so schnell ist wie das Anhängen an das Ende.
Aber Sie können es in Java so machen (in C # ist es dasselbe, aber die Methode wird aufgerufen
Insert
):quelle
Wenn Sie eine hohe Leistung mit vielen Voranmeldungen benötigen, müssen Sie Ihre eigene Version von schreiben
StringBuilder
(oder die einer anderen verwenden). Beim StandardStringBuilder
(obwohl technisch könnte es anders implementiert werden) müssen beim Einfügen Daten nach der Einfügemarke kopiert werden. Das Einfügen von n Textstücken kann O (n ^ 2) dauern.Ein naiver Ansatz wäre, dem Offset-
char[]
Puffer einen Offset sowie die Länge hinzuzufügen . Wenn nicht genügend Platz für ein Präfix vorhanden ist, verschieben Sie die Daten um mehr als unbedingt erforderlich. Dies kann die Leistung wieder auf O (n log n) bringen (glaube ich). Ein verfeinerter Ansatz besteht darin, den Puffer zyklisch zu machen. Auf diese Weise wird der freie Speicherplatz an beiden Enden des Arrays zusammenhängend.quelle
Sie könnten eine Erweiterungsmethode ausprobieren:
quelle
Sie können den String in umgekehrter Reihenfolge erstellen und dann das Ergebnis umkehren. Ihnen entstehen O (n) -Kosten anstelle von O (n ^ 2) -West-Case-Kosten.
quelle
Ich habe es nicht benutzt, aber Ropes For Java klingt faszinierend. Der Projektname ist ein Wortspiel. Verwenden Sie für ernsthafte Arbeiten ein Seil anstelle eines Strings . Umgeht die Leistungseinbußen bei Voranstellungen und anderen Vorgängen. Einen Blick wert, wenn Sie viel davon tun werden.
quelle
Folgendes können Sie tun, wenn Sie die StringBuilder-Klasse von Java voranstellen möchten:
quelle
Wenn ich Sie richtig verstehe, sieht die Einfügemethode so aus, als würde sie das tun, was Sie wollen. Fügen Sie einfach die Zeichenfolge mit dem Versatz 0 ein.
quelle
Versuchen Sie es mit Insert ()
quelle
Den anderen Kommentaren nach zu urteilen, gibt es keinen normalen schnellen Weg, dies zu tun. Verwenden von StringBuilder
.Insert(0, "text")
ist ungefähr nur 1-3x so schnell wie die Verwendung einer schmerzhaft langsamen String-Verkettung (basierend auf> 10000 Concats). Im Folgenden finden Sie eine Klasse, die möglicherweise tausendmal schneller vorangestellt werden kann!Ich habe einige andere grundlegende Funktionen wie eingeschlossen
append()
,subString()
undlength()
usw. Beide Appends und wird vorangestellt variieren von etwa doppelt so schnell zu 3x langsamer als String anhängt. Wie bei StringBuilder erhöht sich der Puffer in dieser Klasse automatisch, wenn der Text die alte Puffergröße überschreitet.Der Code wurde ziemlich oft getestet, aber ich kann nicht garantieren, dass er frei von Fehlern ist.
quelle
Sie können selbst eine Erweiterung für StringBuilder mit einer einfachen Klasse erstellen:
Dann fügen Sie einfach hinzu:
An der Spitze jeder Klasse, in der Sie den StringBuilder verwenden möchten, und jedes Mal, wenn Sie Intelli-Sense mit einer StringBuilder-Variablen verwenden, werden die Methoden Prepend und PrependLine angezeigt. Denken Sie daran, dass Sie bei Verwendung von Voranstellen in umgekehrter Reihenfolge voranstellen müssen, als wenn Sie Anhängen.
quelle
Das sollte funktionieren:
quelle
string
, jedoch nicht mit TypwertenStringBuilder
. Die Antwort von @ScubaSteve funktioniert gut.