bur*_*1ce 97 c# java stringbuilder
我知道我们可以使用附加字符串StringBuilder
.有没有办法我们可以预先添加字符串(即在字符串前添加字符串),StringBuilder
这样我们可以保持提供的性能优势StringBuilder
?
Joa*_*uer 29
预先设置String通常需要在插入点之后将所有内容复制回支持数组中的某些内容,因此它不会像追加到结尾那样快.
但你可以在Java中这样做(在C#中它是相同的,但调用方法Insert
):
aStringBuilder.insert(0, "newText");
Run Code Online (Sandbox Code Playgroud)
Tom*_*ine 11
如果你需要高性能和大量的前置,你需要编写自己的版本StringBuilder
(或使用其他人的).使用该标准StringBuilder
(虽然从技术上讲它可以以不同方式实现)插入需要在插入点之后复制数据.插入n段文本可能需要O(n ^ 2)时间.
一种天真的方法是在后备char[]
缓冲区中添加一个偏移量以及长度.当没有足够的空间用于前置时,将数据向上移动超过严格必要的数量.这可以将性能降低到O(n log n)(我认为).更精确的方法是使缓冲区循环.以这种方式,阵列两端的备用空间变得连续.
如果您想预先使用 Java 的 StringBuilder 类,您可以执行以下操作:
StringBuilder str = new StringBuilder();
str.Insert(0, "text");
Run Code Online (Sandbox Code Playgroud)
您可以尝试一种扩展方法:
/// <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!
Run Code Online (Sandbox Code Playgroud)
您可以反向构建字符串,然后反转结果。您需要支付O(n)的费用,而不是O(n ^ 2)的最坏情况的费用。
归档时间: |
|
查看次数: |
59824 次 |
最近记录: |