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?
Antworten
Zu viele Anzeigen?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");
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.
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!
- See previous answers
- Weitere Antworten anzeigen