如何修剪StringBuilder字符串?

时间:2012-06-19 04:56:56

标签: java c#

如何在不使用StringBuilder导致的开销的情况下修剪StringBuilder.toString().trim()值,从而为每个修剪调用创建新的String和/或新的StringBuilder实例?

5 个答案:

答案 0 :(得分:19)

  

为什么StringBuilder没有trim()方法

  1. 因为这就是它的设计方式。尝试询问设计师 1
  2. 因为没有太多的要求。
  3. 因为String trim()语义和签名不适合可变字符串,但这是有争议的。
  4. 无论哪种方式,答案都与解决问题无关。

      

    我们如何修剪StringBuilder值?

    最简单的方法是使用StringBuilder.toString().trim() ...

      

    我不想使用StringBuilder.toString()。trim()。

    在这种情况下,您需要执行trim()所涵盖的内容:匹配并删除前导和尾随空格。由于StringBuilder API没有正则表达式支持,因此您需要以此方式执行此操作;即通过向前和向后迭代字符来查看需要删除的字符,等等。

    你确定你不喜欢这么简单吗?如果没有,这个Q& A有一些示例实现,分析,基准测试等等:

    最后,您可以实现自己拥有StringBuilder方法的trim()类的变体。您可以使用不同的内部表示,以便在开头删除字符的操作不会复制字符。 (我不推荐这个......但是如果你对trim()有一个非常实用的需求,那么这是一个选择。)


      

    实际上我在一个循环中,我必须将这个StringBuilder字符串与许多其他值进行比较,所以如果我每次调用StringBuilder.toString().trim(),它将创建一个新实例,我不想每次都创建一个新的String对象。

    另一方面,从StringBuilder的开头删除字符需要复制所有剩余的字符。

    也许你最好将完整的StringBuilder变成String开始,然后当你使用trim()substring()之类的时候,你就赢了'要复制字符 2


    1 - 对于那些声称“没有建设性”的人来说,另一种方法是在做出设计决定时假装我们 在房间里我们< em>做了听到发生的辩论。但这将是一个谎言。坦率地说, 是建设性的,指出这里没有人知道答案,也没有假装。为什么?因为许多读者不会意识到那时的Java设计过程是不透明的。

    2 - 在Java 7之前,这些方法的工作原理是创建一个新的String,共享原始String的后备数组...所以你最终只能复制字符串的控制信息。在Java 7中,他们更改了trimsubstring的实现,以便他们使用String构造函数来复制支持数组的子数组。

答案 1 :(得分:3)

我不知道你想要实现什么,但是如果你担心性能,也许你可以在附加到StringBuilder时执行修剪。

stringbuilder.append(string.trim())

答案 2 :(得分:1)

  

为什么StringBuilder没有trim()方法?

嗯...... StringBuilderString 类似,只是稍有不同,它可以在创建后修改,否则它与字符串相同。

StringBuilder

如上面的链接所述, StringBuilder上的主要操作是append和insert方法。我猜他们被提议支持可变字符串,与StringBuffer相同。如果你可以通过对其他方法的小调用来完成工作,然后是所需的方法,那么问题是什么。为什么要在多个类中实现相同的实现。

  

我们如何修剪StringBuilder值?

正如其他人所说stringBuilder.toString().trim();

  

我不想使用StringBuilder.toString().trim()

嗯...选择问题,有什么具体原因吗?

答案 3 :(得分:0)

您可以将StringBuilder个实例转换为string,以后可以修剪。

sb.toString().trim();//sb is stringBuilder Instance.

答案 4 :(得分:0)

使用StringBuilder.toString().trim()但将其保存在变量中。

例如:

String myTrimmedString = myStringBuilder.toString().trim();

它没有trim()方法,因为使用不可变对象非常容易并且有些优先。想象一下,一个线程正在修剪StringBuilder而另一个线程正在追加它。想象一下可能导致代码中出现的错误和怪异。