169 Stimmen

Wie können wir Zeichenfolgen mit StringBuilder vorangestellt?

Ich weiß, dass wir Strings anhängen können mit StringBuilder . Gibt es eine Möglichkeit, Zeichenketten voranzustellen (d. h. Zeichenketten vor einer Zeichenkette hinzuzufügen), indem man StringBuilder damit wir die Leistungsvorteile behalten können, die StringBuilder Angebote?

251voto

driis Punkte 156110

Die Verwendung der Einfügemethode mit dem Positionsparameter 0 wäre dasselbe wie das Voranstellen (d. h. das Einfügen am Anfang).

C# Beispiel : varStringBuilder.Insert(0, "someThing");

Java Beispiel : varStringBuilder.insert(0, "someThing");

Es funktioniert sowohl für C# y Java

38voto

Joachim Sauer Punkte 290477

Das Voranstellen eines Strings erfordert in der Regel das Kopieren aller Elemente nach dem Einfügepunkt zurück in das Backing-Array, so dass es nicht so schnell geht wie das Anhängen an das Ende.

Aber in Java kann man das so machen (in C# ist es dasselbe, aber die Methode heißt Insert ):

aStringBuilder.insert(0, "newText");

15voto

Tom Hawtin - tackline Punkte 142461

Wenn Sie hohe Leistung mit vielen Prepends benötigen, müssen Sie Ihre eigene Version von StringBuilder (oder verwenden Sie die von jemand anderem). Mit dem Standard StringBuilder (obwohl es technisch anders implementiert werden könnte) erfordern das Kopieren von Daten nach dem Einfügepunkt. Das Einfügen von n Textstücken kann O(n^2) Zeit in Anspruch nehmen.

Eine naive Herangehensweise wäre, einen Offset in das Backing einzufügen char[] Puffer sowie die Länge. Wenn nicht genug Platz für ein Prepend vorhanden ist, verschieben Sie die Daten um mehr als unbedingt nötig nach oben. Dadurch kann die Leistung wieder auf O(n log n) gesenkt werden (glaube ich). Ein verfeinerter Ansatz besteht darin, den Puffer zyklisch zu machen. Auf diese Weise wird der freie Platz an beiden Enden des Arrays zusammenhängend.

9voto

s_hewitt Punkte 4172

So können Sie vorgehen, wenn Sie die StringBuilder-Klasse von Java verwenden möchten:

StringBuilder str = new StringBuilder();
str.Insert(0, "text");

8voto

Mark Maxham Punkte 1461

Sie könnten es mit einer Erweiterungsmethode versuchen:

/// <summary>
/// kind of a dopey little one-off for StringBuffer, but 
/// an example where you can get crazy with extension methods
/// </summary>
public static void Prepend(this StringBuilder sb, string s)
{
    sb.Insert(0, s);
}

StringBuilder sb = new StringBuilder("World!");
sb.Prepend("Hello "); // Hello World!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X