Java:StringBuffer和串联

时间:2020-03-06 14:54:45  来源:igfitidea点击:

我在Java中使用StringBuffer将字符串连接在一起,如下所示:

StringBuffer str = new StringBuffer();

str.append("string value");

我想知道是否有一种方法(尽管我从文档中没有发现任何东西)或者某种其他方式来添加"填充"。

让我解释;每次我向字符串添加内容时,我都想在末尾添加一个空格,如下所示:

String foo = "string value";
str.append(foo + " ");

并且我有几个要追加的电话..每次,我想添加一个空格。有没有一种方法可以设置对象,使其在每次追加后自动添加一个空格?

编辑 -

String input
StringBuffer query = new StringBuffer();
Scanner scanner = new Scanner(System.in);
scanner.UseDelimiter("\n");

do {
   System.out.println("sql> ");

   input = scanner.next();

   if (!empty(input)) query.append(input);

   if (query.toString().trim().endsWith(";")) {
         //run query
   }
}
while (!input.equalsIgnoreCase("exit");

我将按照grom的建议使用StringBuilder,但是现在代码就是这样

解决方案

按照我们自己的示例,只需自己添加空间,这很容易。

我们是否不能创建一个新的类来包装StringBuffer并添加一个appendWithTrailingSpace()方法?

CustomStringBuffer str = new CustomStringBuffer();
str.appendWithTrailingSpace("string value");

(尽管我们可能想将方法调用得更短一些。)

StringBuffer是最终的。我们不能从中得出。
最好的解决方案实际上是为自己添加填充。为此编写一个方法并使用PADDING-Constant,以便我们可以轻松地对其进行更改,或者最好将其放入参数中。

我们应该使用StringBuilder。

Where possible, it is recommended that this class be used in preference to StringBuffer as it will be faster under most implementations.

另一种可能性是,当我们调用append时,StringBuilder对象将返回自身,这意味着我们可以执行以下操作:

str.append("string value").append(" ");

虽然不那么精巧,但是它可能比+""方法更容易解决。

另一种可能性是构建一个包装器类,例如PaddedStringBuilder,该类提供相同的方法,但会应用所需的填充,因为我们无法继承。

我认为这可以通过使用辅助方法(未经测试的代码)更轻松地进行处理:

public String myMethod() {
    StringBuilder sb = new StringBuilder();
    addToBuffer(sb, "Hello").addToBuffer("there,");
    addToBuffer(sb, "it").addToBuffer(sb, "works");
}

private StringBuilder addToBuffer(StringBuilder sb, String what) {
    return sb.append(what).append(' ');  // char is even faster here! ;)
}

甚至使用具有流畅接口的Builder模式(也是未经测试的代码):

public String myMethod() {
    SBBuilder builder = new SBBuilder()
        .add("Hello").add("there")
        .add("it", "works", "just", "fine!");

    for (int i = 0; i < 10; i++) {
        builder.add("adding").add(String.valueOf(i));
    }

    System.out.println(builder.build());
}

public static class SBBuilder {
    private StringBuilder sb = new StringBuilder();

    public SBBuilder add(String... parts) {
        for (String p : parts) {
            sb.append(p).append(' '); // char is even faster here! ;)
        }
        return this;
    }

    public String build() {
        return sb.toString();
    }
}

这是有关该主题的文章。

希望能帮助到你! :)