【问题标题】:Use StringBuffer to replace substring throughout a long string使用 StringBuffer 替换整个长字符串中的子字符串
【发布时间】:2019-12-01 07:04:15
【问题描述】:

我需要编写一个长字符串(4324 个字符)并希望为此目的使用 StringBuffer。大多数字符串将是空格,但有些部分包含订单详细信息。它们必须出现在某些位置。该字符串将被输入会计系统。

我正在用空格 (" ") 初始化字符串并设置长度,在本例中为 64。

public class BytteTekst {
    public static void main(String[] args) {
        String t1 = "Hej, jeg æder blåbærsyltetøj!";
        String t2 = "foo";

        StringBuffer s = new StringBuffer(" ");
        s.setLength(64);

        System.out.println(t1.length());

        s.replace(0, t1.length(), t1);
        System.out.println(s);

        s.replace(t1.length() + 10, t1.length() + t2.length() + 10, t2);
        System.out.println(s);

        System.out.println(s.length());
    }
}

java BytteTekst 的输出是

29
Hej, jeg æder blåbærsyltetøj!
Hej, jeg æder blåbærsyltetøj!foo
64

当我替换()字符串foo 时,它出现在第一个替换()之后。我需要一些空格才能得到类似这样的结果:

29
Hej, jeg æder blåbærsyltetøj!
Hej, jeg æder blåbærsyltetøj!          foo
64

我是否以错误的方式使用 StringBuffer?它是否默默地忽略了我要添加的空格?

【问题讨论】:

  • 顺便说一句,您应该使用StringBuilder 而不是StringBuffer。 API 基本相同,但避免了不必要的同步。
  • 谢谢,我会用的。它不会从外部访问,所以我不必担心。

标签: java replace whitespace stringbuffer


【解决方案1】:

问题是

s.setLength(64);

将长度更改为 64,用\0 字符填充新空间:其内容将是:

[' ', '\0', '\0', ... '\0'] (1 space, 63 \0s)

第二次替换后,内容将是:

['H', 'e', 'j', ... 't', 'ø', 'j', '!', '\0' (x10), 'f', 'o', 'o', '\0', ...]

所以那里有 空白,它只是未打印的空白。

如果你想用空格而不是'\0' 填充你的字符串,你可以用一个普通的for循环来循环字符串

for (int i = 0; i < 64; ++i) s.setCharAt(i, ' ');

或者用正确的长度硬编码一串空格:

StringBuffer s = new StringBuffer("           "); // Not 64 chars - count carefully!

或者你可以“简单地”用一个充满空格的char[]进行初始化:

char[] fill = new char[64];
Arrays.fill(fill, ' ');
StringBuffer s = new StringBuffer(new String(fill));

【讨论】:

  • 感谢您的详细解释。现在说得通了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 2013-07-10
  • 2016-07-13
  • 2020-04-05
  • 1970-01-01
相关资源
最近更新 更多