当前位置: 首页 > 面试题库 >

如何修剪java stringbuilder?

张淳
2023-03-14
问题内容

我有一个StringBuilder对象,需要修剪(即,从任一端删除所有空白字符/ u0020及以下)。

我似乎找不到在字符串生成器中可以做到这一点的方法。

这是我现在正在做的事情:

String trimmedStr = strBuilder.toString().trim();

这恰好给出了所需的输出,但是它需要分配两个字符串,而不是一个。当字符串仍在StringBuilder中时,有没有更有效的方法来修剪字符串?


问题答案:

您不应使用deleteCharAt方法。

正如鲍里斯指出的那样,deleteCharAt方法每次都会复制该数组。Java 5中执行此操作的代码如下所示:

public AbstractStringBuilder deleteCharAt(int index) {
    if ((index < 0) || (index >= count))
        throw new StringIndexOutOfBoundsException(index);
    System.arraycopy(value, index+1, value, index, count-index-1);
    count--;
    return this;
}

当然,仅凭猜测还不足以选择一种优化方法而不是另一种优化方法,因此我决定在此线程中计时三种方法:原始方法,删除方法和子字符串方法。

这是我为原始代码测试的代码:

public static String trimOriginal(StringBuilder sb) {
    return sb.toString().trim();
}

删除方法

public static String trimDelete(StringBuilder sb) {
    while (sb.length() > 0 && Character.isWhitespace(sb.charAt(0))) {
        sb.deleteCharAt(0);
    }
    while (sb.length() > 0 && Character.isWhitespace(sb.charAt(sb.length() - 1))) {
        sb.deleteCharAt(sb.length() - 1);
    }
    return sb.toString();
}

和子串方法:

public static String trimSubstring(StringBuilder sb) {
    int first, last;

    for (first=0; first<sb.length(); first++)
        if (!Character.isWhitespace(sb.charAt(first)))
            break;

    for (last=sb.length(); last>first; last--)
        if (!Character.isWhitespace(sb.charAt(last-1)))
            break;

    return sb.substring(first, last);
}

我执行了100次测试,每次生成带有一万个尾随和前导空格的百万字符StringBuffer。测试本身是非常基础的,但是可以很好地了解这些方法需要花费多长时间。

这是计时三种方法的代码:

public static void main(String[] args) {

    long originalTime = 0;
    long deleteTime = 0;
    long substringTime = 0;

    for (int i=0; i<100; i++) {

        StringBuilder sb1 = new StringBuilder();
        StringBuilder sb2 = new StringBuilder();
        StringBuilder sb3 = new StringBuilder();

        for (int j=0; j<10000; j++) {
            sb1.append(" ");
            sb2.append(" ");
            sb3.append(" ");
        }
        for (int j=0; j<980000; j++) {
            sb1.append("a");
            sb2.append("a");
            sb3.append("a");
        }
        for (int j=0; j<10000; j++) {
            sb1.append(" ");
            sb2.append(" ");
            sb3.append(" ");
        }

        long timer1 = System.currentTimeMillis();
        trimOriginal(sb1);
        originalTime += System.currentTimeMillis() - timer1;

        long timer2 = System.currentTimeMillis();
        trimDelete(sb2);
        deleteTime += System.currentTimeMillis() - timer2;

        long timer3 = System.currentTimeMillis();
        trimSubstring(sb3);
        substringTime += System.currentTimeMillis() - timer3;
    }

    System.out.println("original:  " + originalTime + " ms");
    System.out.println("delete:    " + deleteTime + " ms");
    System.out.println("substring: " + substringTime + " ms");
}

我得到以下输出:

original:  176 ms
delete:    179242 ms
substring: 154 ms

如我们所见,与原始的“两个字符串”方法相比,子字符串方法提供了非常轻微的优化。但是,删除方法非常慢,应该避免。

因此,回答您的问题:您可以按照问题中的建议很好地调整StringBuilder。substring方法提供的非常轻微的优化可能无法证明多余的代码是正确的。



 类似资料:
  • 问题内容: 是否有Python函数可以从字符串中修剪空白(空格和制表符)? 例如:→ 问题答案: 对于两侧的空格,请使用: 对于右侧的空格,请使用: 对于左侧的空格: 正如thedz所指出的,您可以提供一个参数来将任意字符剥离到以下任何函数中: 这将去除任何空间,,,或从左侧字符,右手侧,或该字符串的两侧。 上面的示例仅从字符串的左侧和右侧删除字符串。如果还要从字符串中间删除字符,请尝试: 那应该

  • 问题内容: 是否有Python函数可以从字符串中修剪空格(空格和制表符)? 例如: 问题答案: 两侧的空格: 右侧的空格: 左侧的空白: 正如thedz所指出的,你可以提供一个参数来将任意字符剥离到以下任何函数中: 这将去除任何空间,,或从左侧字符,右手侧,或该字符串的两侧。 上面的示例仅从字符串的左侧和右侧删除字符串。如果还要从字符串中间删除字符,请尝试: 那应该打印出来:

  • 问题内容: 我有一个称为render_something的方法,该方法可以创建很多空白,例如: 结果可能是: 我实际上希望它是这样的: 速度有这样的东西吗? 问题答案: 我刚刚读了这篇关于Velocity Whitespace Gobbling的 文章,其中提出了一些变通方法,包括Line Line截断了Velocity Whitespace 。 这基本上建议通过在每行末尾添加注释来注释掉换行符。

  • 问题内容: 通过使用sanselan,我发现导入到Windows的iPhone照片变得无法编辑的根本原因是实际XML后面有内容(空格?)(有关详细信息和不良XMP XML的链接示例,请参见https) ://apple.stackexchange.com/questions/45326/why-can-i-not-edit-some-photos-imported-from-an-iphone-t

  • 问题内容: 假设$ 2是我的变量。我尝试过 至 但是它从打印某些内容到什么都不打印。 问题答案: 您正在打印的结果,但是进行的就地修改,而不是返回修改后的副本。致电,然后打印:

  • 问题内容: [我已输入,我需要处理和丢弃所有的白色空间,包括非换空间的输入文件又名(您可以通过按生产它在记事本中,然后键入 从键盘的数字小键盘。)或任何其他形式的空白空间。我已经尝试过了,但是没有修剪。 我是否需要显式检查,然后是否有一种简便的方法来修剪Java中的所有空白? 问题答案: 虽然是一个不间断的空格(不想被视为空格的空格),但是您可以修剪字符串,同时使用简单的正则表达式保留字符串中的每