C#或Java:使用StringBuilder预先添加字符串?

bur*_*1ce 97 c# java stringbuilder

我知道我们可以使用附加字符串StringBuilder.有没有办法我们可以预先添加字符串(即在字符串前添加字符串),StringBuilder这样我们可以保持提供的性能优势StringBuilder

dri*_*iis 152

使用position参数设置为0的insert方法与prepend相同(即在开头插入).

varStringBuilder.insert(0, "someThing");

它适用于C#Java

  • 用于java的StringBuilder插入:http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StringBuilder.html#insert(int,%20boolean) (7认同)

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)(我认为).更精确的方法是使缓冲区循环.以这种方式,阵列两端的备用空间变得连续.


s_h*_*itt 6

如果您想预先使用 Java 的 StringBuilder 类,您可以执行以下操作:

StringBuilder str = new StringBuilder();
str.Insert(0, "text");
Run Code Online (Sandbox Code Playgroud)


Mar*_*ham 5

您可以尝试一种扩展方法:

/// <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)


bri*_*ght 5

您可以反向构建字符串,然后反转结果。您需要支付O(n)的费用,而不是O(n ^ 2)的最坏情况的费用。

  • 仅在附加单个字符时有效。否则,您需要颠倒附加的每个字符串,根据字符串的大小和数量,这些字符串将消耗最多(如果不是全部)节省的钱。 (2认同)